您现在的位置是:首页 >

虚拟机vm12和vm15哪个好用 发现Java虚拟机内存泄露问题

火烧 2022-11-30 09:28:55 1056
发现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 会被及时回收 不会出现内存溢出错误

虚拟机vm12和vm15哪个好用 发现Java虚拟机内存泄露问题

  如果我们实际执行这个例子 会发现出现了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  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码