Java有了GC同样会出现内存泄露问题
2024-08-25 13:58:47
1.静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。
Static Vector v = new Vector();
for (int i = 1; i<100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}
在这个例子中,代码栈中存在Vector 对象的引用 v 和 Object 对象的引用 o 。在 For 循环中,我们不断的生成新的对象,然后将其添加到 Vector 对象中,之后将 o 引用置空。问题是当 o 引用被置空后,如果发生 GC,我们创建的 Object 对象是否能够被 GC 回收呢?答案是否定的。因为, GC 在跟踪代码栈中的引用时,会发现 v 引用,而继续往下跟踪,就会发现 v 引用指向的内存空间中又存在指向 Object 对象的引用。也就是说尽管o 引用已经被置空,但是 Object 对象仍然存在其他的引用,是可以被访问到的,所以 GC 无法将其释放掉。如果在此循环之后, Object 对象对程序已经没有任何作用,那么我们就认为此 Java 程序发生了内存泄漏。
2.各种连接,数据库连接,网络连接,IO连接等没有显示调用close关闭,不被GC回收导致内存泄露。
3.监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。
最新文章
- [OpenCV] Samples 12: laplace
- IOS开发——02_第一个类的创建、声明…
- list转datatable
- Java log4j详细教程
- 通过NameValuePairsValueProvider对象来获取指定前缀的Key
- python核心编程学习记录之基础知识
- python 补充-decode和encode
- SQL语句查找重复记录
- wordpress换域名后无法登陆的解决方案
- iOS开发系列之运动事件
- 七.生成n位随机字符串
- dev中 使用一些控件后,窗体屏蔽右键某些菜单
- WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(二)实现IRequestChannel(2016-03-15 12:35)
- python 附加作业01
- ansible之一:安装与配置
- 自建 Gitlab (邮箱配置、拆分 PostgreSQL、Redis) + 随想
- oracle的存储过程和定时任务编写体会
- poi-对于word的操作(一)
- Codeforces 295C Greg and Friends BFS
- python基础之import模块导入和包的调用