先介绍一下堆空间:
堆对于一个JVM进程来说是唯一的,一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一个堆空间的。
问题来了,新生代中为什么有两个survivor区,我们来解释说明一下
解答:是为了解决内存的碎片化问题,那么为什么会产生碎片化呢?我们来画图说明一下...
若存在两个S区:
结论:不会产生内存碎片
若只有一个S区:
结论:在第二次回收时,就有可能开始产生内存碎片
另外补充几个参数:
- -Xms:初始堆空间内存
- -Xmx:最大堆空间内存
- -Xmn:设置新生代大小
- -XX:+PrintGCDetails :收集器日志参数
- -XX:Survivor-Ratio=8 :决定了新生代中Eden区与一 个Survivor区的空间比例是8∶1
- -XX:PretenureSizeThreshold :指定大于该设置值的对象直接在老年代分配
- -XX:MaxTenuringThreshold :设置新生代垃圾的最大年龄
- -XX:HandlePromotionFailure :是否设置空间分配担保