模擬一下gc以及如何jstat查看內(nèi)存使用情況
在第一次yung gc的時候內(nèi)存eu 是3544.8kb,ec是3648kb束亏,此時在生成1M數(shù)組內(nèi)存铃在。gc后,gc日志打印發(fā)現(xiàn)整個堆存活1836kb碍遍,年輕代存活1216K(一個survivor大卸ㄍ)。jstat打印gc后發(fā)現(xiàn)s1u是1216kb怕敬,ou是620.3kb揣炕。也就是說一次gc后存活對象先分配到survivor區(qū),不夠的部分再直接送到老年代(這里有個疑問赖捌,之前看網(wǎng)上知名博客寫祝沸,如果gc后survivor不夠存放存活的對象 會直接送到老年代,也就是會把1836kb直接送到老年代越庇,和我們這里的一部分放到survivor取罩锐,剩余部分送到老年代有出入)
-XX:NewSize=6284928
-XX:MaxNewSize=6284928
-XX:InitialHeapSize=10485760
-XX:MaxHeapSize=10485760
-XX:SurvivorRatio=3
-XX:PretenureSizeThreshold=10485760
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:D:\gc.log
public static void main(String[] args){
byte[] arr = new byte[1024 * 1024];
arr = new byte[1024 * 1024];
arr = new byte[1024 * 1024];
arr = null;
byte[] arr2 = new byte[2 * 1024 * 1024];
System.out.println("result:");
}
image.png
gc日志
Java HotSpot(TM) 64-Bit Server VM (25.74-b02) for windows-amd64 JRE (1.8.0_74-b02), built on Jan 29 2016 17:42:36 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 16683976k(4345536k free), swap 33366052k(16745224k free)
CommandLine flags: -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:MaxNewSize=6284928 -XX:NewSize=6284928 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=3 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC
55.809: [GC (Allocation Failure) 55.810: [ParNew: 3544K->1216K(4864K), 0.0057888 secs] 3544K->1836K(9024K), 0.0061215 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]