知识大全 发现Java虚拟机内存泄露问题
Posted 变量
篇首语:寸阳分阴须爱惜,休负春色与时光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 发现Java虚拟机内存泄露问题相关的知识,希望对你有一定的参考价值。
发现Java虚拟机内存泄露问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
内存泄露问题对于程序来说 是一个很难发现 并且容易引起严重灾害的事情 Java一直以其垃圾回收机制为自豪 那是否这种机制就是完美的呢常规理解上 Java的内存管理机制是将局部变量保存在堆中 当变量的作用域结束之后 该变量所占用的内容会被自动回收 不需要做任何特殊的处理 比如下面的代码
public class JavaMemory private final int dataSize = (int) (Runtime getRuntime() maxMemory() * ); public void f() byte[] data = new byte[dataSize]; byte[] data = new byte[dataSize]; public static void main(String[] args) JavaMemoryPuzzle jmp = new JavaMemoryPuzzle(); jmp f();在这个例子中 方法f()里定义了两个局部变量 变量data 和data 的作用域不同 按照正常理解 虽然两各个数组所需要的内存之和已经超过了可用内存 但是因为data 会被及时回收 不会出现内存溢出错误
如果我们实际执行这个例子 会发现出现了java lang OutOfMemoryError错误 这是为什么?如果在BEA或者IBM的虚拟机上测试过这个例子 并不会出现错误 也就是说 SUN的JVM在内存回收机制上存在漏洞或者BUG
这个问题该如何修正呢 方法其实很简单 只需要在变量作用域结束之前 将变量置为空就可以了 修改之后的结果如下
public class JavaMemory private final int dataSize = (int) (Runtime getRuntime() maxMemory() * ); public void f() byte[] data = new byte[dataSize]; data = null; byte[] data = new byte[dataSize]; public static void main(String[] args) JavaMemoryPuzzle jmp = new JavaMemoryPuzzle(); jmp f(); public class JavaMemory private final int dataSize = (int) (Runtime getRuntime() maxMemory() * ); public void f() byte[] data = new byte[dataSize]; int i= ; byte[] data = new byte[dataSize]; public static void main(String[] args) JavaMemoryPuzzle jmp = new JavaMemoryPuzzle(); jmp f(); cha138/Article/program/Java/hx/201311/27088相关参考