博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(6)java的内存泄露问题
阅读量:6229 次
发布时间:2019-06-21

本文共 979 字,大约阅读时间需要 3 分钟。

一:什么是内存泄露

--->Java的一个最显著的优势是内存管理。你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收。然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现
--->内存泄露的定义:对于应用程序来说,当对象已经不再被使用,但是Java的垃圾回收器不能回收它们的时候,就产生了内存泄露。要理解这个定义,我们需要理解对象在内存中的状态。
如下图所示,展示了哪些对象是无用对象,哪些是未被引用的对象;
---->上图中包含了未引用对象和引用对象。未引用对象将会被垃圾回收器回收,而引用对象却不会。未引用对象很显然是无用的对象。然而,无用的对象并不都是未引用对象,有一些无用对象也有可能是引用对象,这部分对象正是内存泄露的来源。
二:为什么会发生内存泄露
---->让我们用下面的例子来看看为什么会发生内存泄露。如下图所示,对象A引用对象B,A的生命周期(t1-t4)比B的生命周期(t2-t3)要长,当 B在程序中不再被使用的时候,A仍然引用着B。在这种情况下,垃圾回收器是不会回收B对象的,这就可能造成了内存不足问题,因为A可能不止引用着B对象, 还可能引用其它生命周期比A短的对象,这就造成了大量无用对象不能被回收,且占据了昂贵的内存资源。
---->同样的,B对象也可能引用着一大堆对象,这些被B对象引用着的对象也不能被垃圾回收器回收,所有的这些无用对象消耗了大量内存资源。
三:怎样阻止内存泄露
以下是一些阻止内存泄露的经验提示:
多关注集合类,比如HashMap,ArrayList等,这些对象经常会发生内存泄露。比如当它们被声明为静态对象时,它们的生命周期会跟应用程序的生命周期一样长,很容易造成内存不足。
多关注事件监听(listeners)和回调(callbacks),比如注册了一个listener,当它不再被使用的时候,忘了注销该listener,可能就会产生内存泄露。
“如果一个类自己管理自己的内存空间,开发人员需要特别警惕内存泄露”,引用其它对象的成员变量记得要置为null?不太理解(原文:Often times member variables of an object that point to other objects need to be null out);

转载地址:http://lbina.baihongyu.com/

你可能感兴趣的文章
世界政府峰会发布了《在区块链上构建超互联未来》文件
查看>>
实现TeX的算法:回首编程技术的过去三十年
查看>>
JUnit 5 Alpha版本简化了单元测试
查看>>
在2019年,如何成为更好的Node.js开发者?
查看>>
英特尔开源分布式深度学习平台Nauta,使用Kubernetes 和 Docker 平台运行
查看>>
【译】Apache Flink 容错机制
查看>>
Java字节码忍者禁术
查看>>
Firefox 50优化Electrolysis
查看>>
CNCF宣布Envoy项目正式毕业
查看>>
dockerfile中apt-install处理continue
查看>>
封装一个FTP工具类
查看>>
【javascript】字符串及判断方法
查看>>
link 与 controller
查看>>
实践:GNU构建系统
查看>>
扩展spring schema文件
查看>>
经典汉诺塔问题
查看>>
html5整理(一)
查看>>
spring-cloud-config的encrypt功能
查看>>
javascript引用类型之Date
查看>>
Fiddler调试(适合修复线上bug和直接调试线上问题)
查看>>