模拟一下gc以及如何jstat查看内存使用情况
在第一次yung gc的时候内存eu 是3544.8kb,ec是3648kb,此时在生成1M数组内存。gc后,gc日志打印发现整个堆存活1836kb,年轻代存活1216K(一个survivor大小)。jstat打印gc后发现s1u是1216kb,ou是620.3kb。也就是说一次gc后存活对象先分配到survivor区,不够的部分再直接送到老年代(这里有个疑问,之前看网上知名博客写,如果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:");
}
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]