二 JVM.垃圾回收算法/策略内存分配( 七 )


并行GC线程数量
默认99 ,就是1/(1+99) = 1%,允许1% GC 时间;( )
最大回收时间
内存使用率超过多少开始GC
CMS后是否需要整理内存(9后废除)
CMS多少次后整理内存( 9后废除)
9后默认垃圾回收
byteSize
G1目标时间,默认200ms
新生代最小值,默认 5%
新生代最大值,默认 60%
并行GC线程数量
和用户线程一起的时候GC线程数量
默认 45% 表示ytes 堆占比
才能用
cs
何时启动GC (**默认**)、、、(**用**)、(**用**)
使用ZGC
启动NUMA 内存分配支持
8.内存分配和回收策略
Java的内存管理:自动给对象分配内存和回收对象内存;
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64; 最大分配的内存由-Xmx指定,默认是物理内存的1/4 。默认空余堆内存小于40%时,就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,减少堆直到-Xms的最小限制 。服务器一般设置-Xms、-Xmx 相等以避免GC后调整堆的大小 。
JVM使用-XX:设置非堆内存初始值,默认是物理内存的1/64;由XX:设置最大非堆内存的大小,默认是物理内存的1/4 。
8.1 对象优先在Eden
大部分情况是,新的对象在Eden 区中分配 。当Eden 没有空间,就发起Minor GC
/*** VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8* young 10 = 8+1+1Old :10 */public static void testAllocation() {byte[] allocation1, allocation2, allocation3, allocation4;allocation1 = new byte[2 * _1MB];allocation2 = new byte[2 * _1MB];allocation3 = new byte[2 * _1MB];allocation4 = new byte[4 * _1MB];// 出现一次Minor GC4M 无法进入Eden(此时6/8) 直接进入old}
[GC (Allocation Failure) [PSYoungGen: 6439K->911K(9216K)] 6439K->5015K(19456K), 0.0031737 secs] [Times: user=0.09 sys=0.02, real=0.00 secs] HeapPSYoungGentotal 9216K, used 7460K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)eden space 8192K, 79% used [0x00000000ff600000,0x00000000ffc656f8,0x00000000ffe00000)//Eden(此时6/8) 大约6Mfrom space 1024K, 88% used [0x00000000ffe00000,0x00000000ffee3ca0,0x00000000fff00000)tospace 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)ParOldGentotal 10240K, used 4104K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)//Old 使用4Mobject space 10240K, 40% used [0x00000000fec00000,0x00000000ff002020,0x00000000ff600000)Metaspaceused 3091K, capacity 4556K, committed 4864K, reserved 1056768Kclass spaceused 324K, capacity 392K, committed 512K, reserved 1048576K
8.2大对象进入老年代
大对象设置直接进入老年代;因为在年轻代的话,可能需要很多代之后才能进入老年代,带来了很多的复制成本;
8.3 长期存活对象进入老年代
如果垃圾回收器采用分代策略管理堆内存,每次Minor GC 后年龄+1 等到15后升级到老年代;
8.4动态年龄判定
如果空间中相同年龄的对象大小大于 一半,大于等于该年龄的就直接老年代,不需要等前面设置的最大年龄
8.5 空间担保分配
Minor GC前;虚拟机检查老年代连续空间是否大于新生代所有空间;如果大于,说明Minor GC 安全;如果小于,再看参数re 是否允许担保失败,如果 true ;对比老年代最大连续空间 和 历次晋升老年代的平均内存大小,大于 可以Minor GC ,小于Full GC;
?