苏州阊胥路北大青鸟 北大青鸟苏州阊胥路标准化校区
  青鸟学院·西祠讨论版·联系我们  
全国免费电话:400-888-1050
 
首页 | 新闻动态 | 学校介绍 | 课程详解 | 师资力量 | 学习园地 | 就业广场 | 开发技术 | 校区招聘
  在线报名 在线留言  
   
您的位置:首页 - JAVA技术  
发现Java虚拟机内存泄露问题  
2010-7-26  发布人:周佳佳  浏览次数::

内存泄露问题对于程序来说,是一个很难发现,并且容易引起严重灾害的事情。Java一直以其垃圾回收机制为自豪,那是否这种机制就是完美的呢。

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

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()里定义了两个局部变量,变量data1data2的作用域不同。按照正常理解,虽然两各个数组所需要的内存之和已经超过了可用内存,但是因为data1会被及时回收,不会出现内存溢出错误。

  如果我们实际执行这个例子,会发现出现了java.lang.OutOfMemoryError错误。这是为什么?如果在BEA或者IBM的虚拟机上测试过这个例子,并不会出现错误。也就是说,SUNJVM在内存回收机制上存在漏洞或者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();

      }

 

 
上一篇:学北大青鸟,做IT精英放飞心中梦想
下一篇:北大青鸟树立起IT职业教育标尺
 
设为首页 | 加入收藏 | 联系我们 | 联系站长 | 友情链接
报名咨询:0512-65566661 65566662   备案许可证号:苏ICP备09076008号
地址:苏州市阊胥路483号创元科技园6号楼1层(干将西路友通数码港向北100米)
交通路线:6、7、7路区间、64、70、88、262、300、303、304、307、318、332、333、333路龙池专线、
522、800、921、932、949.(小日晖桥北站)
 
在线客服
在线客服系统