您现在的位置是:首页
>
虚拟机vm12和vm15哪个好用 发现Java虚拟机内存泄露问题
发现Java虚拟机内存泄露问题 内存泄露问题对于程序来说 是一个很难发现 并且容易引起严重灾害的事情 Java一直以其垃圾回收机制为自豪 那是否这种机制就是完美的呢 常规理解上 Java的内存管理
发现Java虚拟机内存泄露问题
内存泄露问题对于程序来说 是一个很难发现 并且容易引起严重灾害的事情 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(); } } lishixinzhi/Article/program/Java/hx/201311/27088 很赞哦! (1056)