对象在Survivor区中每“熬过”一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁),就将会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold设置。
3、动态对象年龄的判断虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。
4、空间分配担保在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor GC,尽管这次Minor GC是有风险的,如果担保失败则会进行一次Full GC;如果小于,或者HandlePromotionFailure设置不允许冒险,那这时也要改为进行一次Full GC。
虚拟机性能监控与故障处理工具 jps:虚拟机进程状况工具jps格式:jps [options] [hostid]
功能:列出正在执行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。
选项作用-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传给主类main()的参数
-l 输出主类的全名,如果主类执行的是jar,则输出jar的路径
-v 输出虚拟机进程启动时传给jvm的参数
jstat:虚拟机统计信息监视工具
功能:它可以显示本地或者远程[1]虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
命令格式:jstat [option vmid [ interval [s|ms] [count] ] ],参数interval和count代表查询间隔和次数。
其中,如果进程是本地虚拟机进程,则vmid与lvmid一致;如果是远程虚拟机进程,则vmid格式为:[protocol:][//]lvmid[@hostname[:port]/servername]
举例:
S0代表Survivor0;S1代表Survivor1;E代表Eden区;O代表Old区;M代表Metaspace元数据区域(JDK1.8用Metaspace代替了1.7以前的PermGen永久代);CCS表示的是NoKlass Metaspace的使用率也就是CCSU,/CCSC算出来的,具体可参看这里,总之在1.7之前,M所在的位置是P,表示永久代使用的比例;YGC代表程序运行以来共发生Minor GC;YGCT表示其所用的时间;FGC代表程序运行以来共发生Full GC;FGCT表示其所用的时间;GCT表示GC总共花费了所长时间。
jinfo:Java配置信息工具格式:jinfo [option] pid
作用:实时的查看和调整java虚拟机各项参数。
jmap:Java内存映像工具格式:jmap [option] vmid
作用:用于生成堆转储快照(一般称为heapdump或dump文件)。
选项作用-dump 生成Java堆转储快照。格式:-dump:[live,] format -b,file=<filename>,其中live字参数说明是否只dump存活的对象。
-heap 显示Java堆详细信息,只在Linux/Solaris平台下有效
-histo 显示Java堆中对象统计信息
-F 当虚拟机对-dump选项没有响应时,该参数可以强制生成dump快照。只在Linux/Solaris平台下有效
jhat:虚拟机堆转储快照分析工具
作用:配合jmap命令,分析dump文件。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果可以在浏览器中查看。
命令:jhat dumpfile
一般使用专业的工具进行分析,例如:VisualVM,Eclipse Memory Analyzer,IBM HeapAnalyzer等。
jstack:Java堆栈跟踪工具格式:jstack [option] vmid