您现在的位置: 主页 > 上位机技术 > JAVA > 并非非常完美 发现Java虚拟机内存泄露问题
本文所属标签:
为本文创立个标签吧:

并非非常完美 发现Java虚拟机内存泄露问题

来源:网络整理 网络用户发布,如有版权联系网管删除 2018-07-23 

常规理解上,Java的内存管理机制是将局部变量保存在堆中,当变量的作用域结束之后,该变量所占用的内容会被自动回收。不需要做任何特殊的处理。比如下面的代码:

publicclass JavaMemory{

privatefinalint dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);

publicvoid f(){

{

byte[] data1 = newbyte[dataSize];

}

byte[] data2 = newbyte[dataSize];

}

publicstaticvoid main(String[] args) {

JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();

jmp.f();

}

}

在这个例子中,方法f()里定义了两个局部变量,变量data1和data2的作用域不同。按照正常理解,虽然两各个数组所需要的内存之和已经超过了可用内存,但是因为data1会被及时回收,不会出现内存溢出错误。

如果我们实际执行这个例子,会发现出现了java.lang.OutOfMemoryError错误。这是为什么?如果在BEA或者IBM的虚拟机上测试过这个例子,并不会出现错误。也就是说,SUN的JVM在内存回收机制上存在漏洞或者BUG。

这个问题该如何修正呢,方法其实很简单。只需要在变量作用域结束之前,将变量置为空就可以了。修改之后的结果如下:

publicclass JavaMemory{

privatefinalint dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);

publicvoid f(){

{

byte[] data1 = newbyte[dataSize];

data1 = null;

}

byte[] data2 = newbyte[dataSize];

}

publicstaticvoid main(String[] args) {

JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();

jmp.f();

}

}



              查看评论 回复



嵌入式交流网主页 > 上位机技术 > JAVA > 并非非常完美 发现Java虚拟机内存泄露问题
 内存 变量 这个

"并非非常完美 发现Java虚拟机内存泄露问题"的相关文章

网站地图

围观()