程序可以做网站吗,织梦房产网站源码,深圳百度推广代理,网站1996年推广深入理解Java虚拟机---内存分配 GC日志内存分配与回收策略对象优先在Eden分配大对象直接进入老年代长期存活的对象将进入老年代动态对象年龄判定空间分配担保 GC日志
以下两段典型的GC日志#xff1a;
33.125: [GC [DefNew: 3324K-152K(3712K), 0.0025925 secs] 3324K-
33.125: [GC [DefNew: 3324K-152K(3712K), 0.0025925 secs] 3324K-152K(11904K), 0.0031680 secs]
100.667: [Full GC [Tenured: 0K-210K(10240K), 0.0149142 secs] 4603K-210K(19456K), [Perm : 2999K-2999K(21248K)], 0.0150007 secs] [Times: user0.01 sys0.00, real0.02 secs]最前面的数字“33.125”和“100.667”代表了 GC发生的时间这个数字的含义是从 Java虚拟机启动以来经过的秒数。GC日志开头的“ GC”和“Full GC”说明了这次垃圾收集的停顿类型而不是用来区分新生代GC还是老年代GC的。如果有“Full”说明这次GC是发生了STW。如果是 调用System.gc()方法所触发的收集那么在这里将显示“Full GC (System)”。 DefNew”、“Tenured”、“Perm”表示GC发生的区域这里显示的区域名称与使用的GC收集器是密切相关的例如上面样例所使用的Serial收集器中的新生代名为“Default New Generation”所以显示的是“DefNew”。如果是ParNew收集器 新生代名称就会变为“ParNew”意为“Parallel New Generation”。如果采用Parallel Scavenge收集器那它配套的 新生代称为“PSYoungGen”老年代和永久代同理名称也是由收集器决定的。后面方括号内部的“ 3324K-152K(3712K)”含义是“GC前该内存区域已使用容量- GC后该内存区域已使用容量 (该内存区域总量)”。而在 方括号之外的“3324K-152K(11904K)”表示“GC前Java堆已使用容量 - GC后Java堆已使用容量 (Java堆总容量)”。 “0.0025925 secs”表示该内存区域GC所占用的时间单位是秒。
内存分配与回收策略
对象优先在Eden分配
大多数情况下对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时虚拟机将发起一次Minor GC。虚拟机提供了-XX:PrintGCDetails这个收集器日志参数告诉虚拟机在发生垃圾收集行为时打印内存回收日志并且在进程退出的时候输出当前内存各区域的分配情况。在实际应用中内存回收日志一般是打印到文件后通过日志工具进行分析。 新生代GCMinor GC发生在新生代的垃圾收集动作Minor GC非常频繁一般回收速度也比较快。 老年代GCMajor GC / Full GC发生在老年代的GC出现了Major GC。MajorGC的速度一般会比Minor GC慢10倍以上。
大对象直接进入老年代
所谓大对象指需要大量连续内存空间的Java对象最典型的大对象就是那种很长的字符串及数组。虚拟机提供了一个-XX:PretenureSizeThreshold参数令大于这个设置值的对象直接在老年代中分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存拷贝。 PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效Parallel Scavenge收集器不认识这个参数Parallel Scavenge收集器一般并不需要设置。如果遇到必须使用此参数的场合可以考虑ParNew加CMS的收集器组合。
长期存活的对象将进入老年代
虚拟机给每个对象定义了一个对象年龄Age计数器。如果对象在Eden出生并经过第一次Minor GC后仍然存活并且能被Survivor容纳的话将被移动到Survivor空间中并将对象年龄设为1。对象在Survivor区中每熬过一次Minor GC年龄就增加1岁当它的年龄增加到一定程度默认为15岁时就会被晋升到老年代中。对象晋升老年代的年龄阈值可以通过参数-XX:MaxTenuringThreshold来设置。
动态对象年龄判定
虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升老年代如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半年龄大于或等于该年龄的对象就可以直接进入老年代无须等到MaxTenuringThreshold中要求的年龄。
空间分配担保
在发生Minor GC时虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小如果大于则改为直接进行一次Full GC。如果小于则查看HandlePromotionFailure设置是否允许担保失败如果允许那只会进行Minor GC如果不允许则也要改为进行一次Full GC。
来源《深入理解Java虚拟机》