运行时数据区域
HotSpot虚拟机对象操作
OutOfMemoryError异常
异常这一块还有待完善,后面进一步了解垃圾回收机制,进行内存异常排查时再补充
Java堆内存溢出异常测试
import java.util.ArrayList;
import java.util.List;
/**
* VM options: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/.../java_oom
*/
public class HeapOOM {
static class OOMObject {
}
public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
list.add(new OOMObject());
}
}
}
/* 抛错打印
java.lang.OutOfMemoryError: Java heap space
Dumping heap to /User/.../java_oom/java_pid11783.hprof ...
Heap dump file created [28524065 bytes in 0.116 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at com.guorou.sell.activity.HeapOOM.main(HeapOOM.java:18)
*/
提问环节
- HotSpot虚拟机中,将永久代废弃后,之前存储在永久代的内容现在放到哪儿了?
- HotSpot在JDK8彻底废弃永久代后,取而代之的是使用元空间
- 而元空间也是在方法区实现的,和永久代最大差别是它不在虚拟机中,而是使用本地内存
- 而废弃永久代的理由主要是两方面:
- 这个设计之前是为了偷懒,省去在方法区开发内存管理,结果就是这一块的内存非常容易溢出
- 因为收购了JRockit、J9(这两个就是用了元空间来实现方法区),所以采用和它们一样的实现方式,算是一个优化
- 参考:JVM废弃永久代
- Java虚拟机最常用的参数介绍?分别代表什么含义? | 参数设置 | 描述 | 配置格式 | | —- | —- | —- | | -Xms | 初始化堆空间大小 | -Xms64m | | -Xmx | 最大堆空间大小 | -Xmx128m | | -Xmn | 年轻代的空间大小 | -Xmn32m | | -Xss | 设置线程栈空间大小 | -Xss512k | | -XX:PermSize | 永久代空间大小(jdk8已废弃) | -XX:PermSize=256m | | -XX:MaxPermSize | 最大永久区大小 | -XX:MaxPermSize=256m | | -XX:+UseStringCache | 启用缓存常用字符产 | | | -XX:+UseConcMarkSweepGC | 老年代使用cms收集器 | | | -XX:+UseParNewGC | 新生代使用并行收集器 | | | -XX:+ParallelGCThreads | 设置并行线程数量 | -XX:+ParallelGCThreads=4 | | -XX:+CMSClassUnloadingEnabaled | 允许对类元数据进行清理 | | | -XX:+DisableExplicitGC | 禁止显示GC | | | -XX:+UseCMSInitiatingOccupancyOnly | 表示达到阀值之后才进行CMS回收 | | | -XX:+CMSInitiatingOccupanyFraction | 设置CMS老年代回收阀值百分比 | -XX:+CMSInitiatingOccupanyFraction=68 | | -verbose:gc | 输出虚拟机GC详情 | | | -XX:+PrintGCDetails | 打印GC详情 | | | -XX:+PrintGCDateStamps | 打印GC的耗时 | | | -XX:+PrintTenuringDistribution | 打印tenuring年龄信息 | | | -XX:+HeapDumpOnOutOfMemoryError | 当抛出OOM时进行HeapDump | - | | -XX:+HeapDumpPath | 指定HeapDump的文件路径和目录 | - |