读书笔记-深入理解JVM虚拟机-1.OOM初探

来源:互联网 发布:阿里云自建数据库 编辑:程序博客网 时间:2024/05/21 22:54
Java堆OOM(Out-Of-Memory)异常
运行如下程序,爆出异常 java.lang.OutOfMemoryError: Java heap space
[java] view plaincopyprint?
  1. /** 
  2.  * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 
  3.  * @author zzm 
  4.  */  
  5. public class HeapOOM {  
  6.   
  7.   
  8.     static class OOMObject {  
  9.     }  
  10.   
  11.   
  12.     public static void main(String[] args) {  
  13.         List<OOMObject> list = new ArrayList<OOMObject>();  
  14.   
  15.   
  16.         while (true) {  
  17.             list.add(new OOMObject());  
  18.         }  
  19.     }  
  20. }  


分析:
1.内存配置
-Xms20m 堆的大小是20M
-Xmx20m 堆最大可以扩展到20M,由于堆的大小本来就是20M 所以该堆不可以扩展
-XX:+HeapDumpOnOutOfMemoryError 当出现OutOfMemory异常的时候导出堆文件


OOMObject用来占用空间,用一个List来存储OOMObject以保证我们每个生成的OOMObject对象可以和GCRoot引用链连接起来
这样的话就会导致OOM异常。因为每个对象都是有用的(都是可以和GCRoot连接起来的)


分析OOM问题的一般步骤如下
1.发生OOM了
2.判断发生OOM的位置的对象是否应该是该存活的
3.如果OOM位置的对象是不应该存活的而且发生了OOM异常,那就是我们的程序写的有问题
4.如果OOM的位置的对象是应该存活的但是却发生了OOM异常,那我们就应该适当调整JVM参数了


关于当前这个例子:
很明显我们用的是死循环一直创建对象,并且用List保存持有对象的实例,导致了JVM无法回收创建的对象,所以产生了OOM问题
0 0