JVM参数设置
-XX:NewSize=5242880
-XX:MaxNewSize=5242880
-XX:InitialHeapSize=10485760
-XX:MaxHeapSize=10485760
-XX:SurvivorRatio=8
-XX:PretenureSizeThreshold=10485760
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:
堆内存:10M
新生代:4MB
Survivor to/from:
老年代:5MB
大对象阈值:10M
程序代码
publicclass Demo1 {
publicstaticvoid main(String[] args) {
//生成一个1M的数组
byte[] array1 = newbyte[1024 * 1024];
array1 = newbyte[1024 * 1024];
array1 = newbyte[1024 * 1024];
array1 = null;
//生成一个2M的数组
byte[] array2 = newbyte[2 * 1024 * 1024];
}
}
在生成一个2M的数组之前,JVM运行时内存图应该是这样的
Eden 区有3个数组没有人引用,成了垃圾,共占用3M的内存,但是代码继续运行下去,需要在Eden区生成一个2M大小的数组
此时Eden区空间不够就会触发年轻代的Young GC
打开,日志如下所示
Java HotSpot(TM) 64-Bit Server VM () for windows-amd64 JRE (), built on Oct 5 2019 03:11:30 by "java_re" with MS VC++ (VS2010)
Memory: 4k page, physical 16603172k(7254628k free), swap 17717284k(6828216k free)
CommandLine flags: -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:MaxNewSize=5242880 -XX:NewSize=5242880 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC
: [GC (Allocation Failure) : [ParNew: 3842K->512K(4608K), 0.0012121 secs] 3842K->1685K(9728K), 0.0013657 secs] [Times: user=0.13 sys=0.02, real=0.00 secs] Heap
par new generation total 4608K, used 3746K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
eden space 4096K, 78% used [0x00000000ff600000, 0x00000000ff9288e8, 0x00000000ffa00000)
from space 512K, 100% used [0x00000000ffa80000, 0x00000000ffb00000, 0x00000000ffb00000)
to space 512K, 0% used [0x00000000ffa00000, 0x00000000ffa00000, 0x00000000ffa80000)
concurrent mark-sweep generation total 5120K, used 1173K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
Metaspace used 3251K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 354K, capacity 388K, committed 512K, reserved 1048576K
日志详解
CommandLine flags:虚拟机启动时的参数
GC (Allocation Failure):对象分配失败
:系统运行以后过了多少秒发生了此次GC,本次是93ms
ParNew: 3842K->512K(4608K),0.0012121 secs:此次GC是用ParNew垃圾收集器回收,新生代总空间为4608K(一个Eden4M+一个Survivor(必须保证有一个survivor是空闲的)=) ,GC之前使用了3842K,GC后只有512K的对象存活,耗时1.2ms
3842K->1685K(9728K), 0.0013657 secs:同上,表示整个堆内存的情况,总的堆内存9728k(新生代+老年代5M)