关于java内存泄露
来源:互联网 发布:mac git客户端使用 编辑:程序博客网 时间:2024/04/29 19:19
1)实际上无用,而还被引用的对象,GC就无能为力了(事实上GC认为它还有用),这一点是导致内存泄漏最重要的原因。
例1
Java是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存,但它只能回收无用
并且不再被其它对象引用的那些对象所占用的空间。在下面的代码中,循环申请Object对象,并将所申请的对象放入一个Vector中,
如果仅仅释放对象本身,但是因为Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,
还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。
Vector v = new Vector(10);
for (int i = 1; i < 100; i++)
{Object o = new Object();
v.add(o);
o = null;}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象
例2 失效监听器
这类内存漏洞是一种常见的错误模式 — 称为“失效的监听器”错误 — 通常源于监听器模式的错误应用。监听器模式允许类将事件相互通知给对方;它是 Observer/Observable 模式的一个特别的类,包括一个主题和一个观察器。监听器通常用于为发生在对象上的事件指定事件处理器。一些常用的事件类型是:
GUI 事件通常由专用监听器类来处理,这些类为 AWT、Swing 和其他 GUI 库中的 GUI 事件实现 java.util.EventListener 接口。
数据库连接事件通常由实现 javax.sql.ConnectionEventListener 接口的监听器来处理。
虽然监听器模式被广泛地采用,但如果使用不当很容易出错并可能导致内存漏洞。我们将通过演示监听器在内部实现的方式说明可能出现的漏洞。
但是,如果该引用被保留,则由于可以从根集合中访问而不会回收该对象。在很多情况下,该对象可能会耗费大量系统资源。它可能是一个利用本地系统资源或利用有限资源的大型 GUI 对象,如数据库连接。虽然监听器通常是小对象,并且因此可能不会立刻产生问题,但是保持可访问状态(并且因此而未被回收)的较大对象可能会影响性能,并且可能由于它们对内存的影响而导致系统崩溃。
所以当使用监听器模式时,确保注册与取消注册监听器的调用与所有执行路径相匹配。
- 关于java内存泄露
- 关于java内存泄露
- 关于java的内存泄露
- 关于java的内存泄露
- 关于java的内存泄露
- 关于java内存泄露2--内存泄露示例
- 关于java递归调用内存泄露
- 关于Java内存泄露的问题
- 关于java递归调用内存泄露
- 关于java递归调用内存泄露
- 关于javascript内存泄露
- 关于内存泄露
- 关于内存泄露
- 关于cvvImage内存泄露
- 关于内存泄露
- 关于内存泄露问题
- 关于opencv内存泄露
- 关于内存泄露问题
- SWT_AWT Bridge
- SWT图形用户界面的几个小技巧
- csdn本机写blog设置
- Lambda表达式格式要点
- Lambda表达式与委托类型
- 关于java内存泄露
- css3.0抢先看(六):background-size定义背景大小
- 大学生求职需要学习12种动物精神
- Api函数列表
- LINQ简介
- LINQ简介
- C#多线程编程实例实战
- 应用WAS对web进行压力测试实例详解
- 初识LINQ表达式