ITPub博客

首页 > 大数据 > Hadoop > 发现Java虚拟机内存泄露问题

发现Java虚拟机内存泄露问题

Hadoop 作者:milkyao 时间:2013-05-15 15:32:00 0 删除 编辑

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

public class JavaMemory{     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);     public void f(){         {             byte[] data1 = new byte[dataSize];         }         byte[] data2 = new byte[dataSize];     }     public static void main(String[] args) {         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();         jmp.f();     } }在这个例子中,方法f()里定义了两个局部变量,变量data1和data2的作用域不同。按照正常理解,虽然两各个数组所需要的内存之和已经超过了可用内存,但是因为data1会被及时回收,不会出现内存溢出错误。

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

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

public class JavaMemory{     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);     public void f(){         {             byte[] data1 = new byte[dataSize];             data1 = null;         }         byte[] data2 = new byte[dataSize];     }     public static void main(String[] args) {         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();         jmp.f();     } }发现这个问题,对于Java开发者来说也许会很紧张,担心自己的代码是否会出现同样问题。大家尽可放心,连续出现两个变量占用内存之和超过内存限制的情况概率非常小。并且在两个变量之间,如果定义了其他变量也不会出现这个问题。如下面的代码就不会出现问题:

public class JavaMemory{     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);     public void f(){         {             byte[] data1 = new byte[dataSize];         }     int i=1;         byte[] data2 = new byte[dataSize];     }     public static void main(String[] args) {         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();         jmp.f();     } }  以上就是达内为大家分享的有关Java虚拟机内存泄露问题的相关知识,相信对大家有所帮助,同时也希望大家能够关注我。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21914024/viewspace-1111242/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-06-17