知识大全 发现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

相关参考