文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Sun JVM 垃圾回收机制的一个bug

Sun JVM 垃圾回收机制的一个bug

时间:2010-09-02  来源:游骑兵打先锋

JVM垃圾回收器判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序中的任何一个“活动的部分”所引用,则该对象的的内存空间已无用。
看下面的例子:

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)
  {
         JavaMemory jmp = new JavaMemory();
         jmp.f();
   }
}


在这个例子中,方法f()里定义了两个局部变量,变量data1和data2的作用域不同。按照正常理解,虽然两各个数组所需要的内存之和已经超过了可用内存,但是因为data1会被及时回收,不会出现内存溢出错误。

然而如果我们实际执行这个例子,会发现出现了 java.lang.OutOfMemoryError错误。
这个问题该如何修正呢,方法其实很简单。只需要在变量作用域结束之前,将变量置为空就可以了。修改之后的结果如下:

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)
  {
         JavaMemory jmp = new JavaMemory();
         jmp.f();
   }
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载