博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内存泄露
阅读量:6877 次
发布时间:2019-06-26

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

1. Java内存泄漏与C++的区别

在Java 中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java 中的内存泄漏,这些对象不会被GC 所回收,然而它却占用内存。在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java 中,这些不可达的对象都由GC 负责回收,因此程序员不需要考虑这部分的内存泄漏。

2. 内存泄露示例

Vector v = new Vector(10);  for (int i = 1; i < 100; i++) {      Object o = new Object();      v.add(o);      o = null;  }

Vector中引用的对象存在引用未被释放,出现内存泄漏。

3. 内存泄漏原因

3.1 静态集合类如HashMap,Vector。

3.2 监听器,例如addXXXListener()释放的时候需要删除监听器

3.3 物理连接,如数据库连接,网络连接,不使用的时候需要close。如果使用连接池,显式关闭连接外还需要显式关闭ResultSet Statement对象。

附:subString的内存泄漏

List
handler = new ArrayList
(); for (int i = 0; i < 1000; i++) { String str = new String(new char[10000000]); handler.add(str.substring(1, 5)); }

分析subString源码:

String(int offset, int count, char value[]) {      this.value = value;      this.offset = offset;      this.count = count;  }
实际上为了加快运行的效率,牺牲了内存空间。导致subString得到的对象占用空间并未减少。因此需要调用其拷贝构造方法,修改为

handler.add(new String(str.substring(1, 5)));
分析该构造方法的代码,如果String的大小比其中包含的char数组大小要小,那么就做一次部分拷贝。否则与subString方法类似。

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

你可能感兴趣的文章
Spring 中的 18 个注解,你会几个?
查看>>
react对象控制台输出 null 的问题
查看>>
git操作步骤
查看>>
Spring Boot中如何启动HTTPS?并将http接口转变为https
查看>>
web应用开发常见问题解决总结
查看>>
ngx-echarts的使用
查看>>
回到顶部
查看>>
dubbo网络通讯(四)
查看>>
全局作用域中,用const和let声明的变量去哪了?
查看>>
测者的测试技术手册:Junit执行单元测试用例成功,mvn test却失败的问题和解决方法...
查看>>
设计模式(二十一)状态模式
查看>>
C语言程序设计复习指导
查看>>
[Vuex系列] - Actions的理解之我见
查看>>
Susy 2 教程 — 入门篇
查看>>
Java Bean Copy 性能大比拼
查看>>
Java中的四种引用
查看>>
第二课 如何在WINDOWS环境下搭建以太坊开发环境
查看>>
浅谈QEMU的对象系统
查看>>
Python那么火,到底能用来做什么?我们来说说Python3的主要应用
查看>>
React入门小记
查看>>