
1.java堆
所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节
VM:
-verbose:gc -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError
代码:
public class HeapOOM {
static class OOMOBject {
}
public static void main(String[] args) {
List<OOMOBject> list = new ArrayList<>();
for (int i = 0; i < i+1; i++) {
list.add(new OOMOBject());
Console.log("i-----------------"+i);
}
}
}
控制台异常

java堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常情况。出现java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着进一步提示“java heap space”.
要解决这个区域的异常,一般的手段是首先通过内存映像分析工具对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(memory leak)还是内存溢出(Menory OverFlow)
如果是内存泄漏(Memory Leak),可进一步通过工具查看泄漏对象到GC Roots的引用链,于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收他们的,掌握了泄露对象的类型信息以及GC
Roots引用链的信息,就可以比较精准地定位出泄漏代码的位置。
如果不存在泄漏,换句话说就是内存中的对象确实必须存活着不能被GC掉,那就应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否可以调大,从代码上检查是否存在某些对象生命周期过长,持有状态时间过长的情况,尝试减少程序运行期间的内存消耗
每new一次就会在堆里面占用一次内存,list.add保证了new出来的对象不会被GC,最后java堆放不下,就炸了
网友评论