知识点梳理:
如果垃圾回收频繁出现,或者占用了太长的CPU时间,是需要引起重视的哦,亲;
解析虚拟机日志
-XX:+PrintGC:使用此参数启动Java虚拟机后,只要遇到GC就会打印日志;
图示:如下日志信息
说明:该日志显示,一共进行了4次GC,每次GC占用一行,在GC前,堆空间使用量约为4MB,GC后堆空间使用量为377KB.当前可用的堆空间总和约为16MB(15936KB).最后显示的是本次GC话费的时间;
-XX:+PrintGCDetails:可打印更加详细的日志信息,还会使虚拟机在退出前打印堆的详细信息,详细信息描述了当前堆的各个区间的使用情况。
图示:可能输出的样式:
说明:
- 系统经历3次GC,第1次仅为新生代GC,回收效果是新生代从回收前的8MB降低到1MB。
- 第2次(加粗字体):是FULL GC,它同时回收了新生代,老年代和永久区。日志显示,新生代在这次GC中没有释放空间,老年代从16MB降低到了13MB。整个堆大小从26MB左右降低为13MB左右。永久区的大小没有变化。在日志的最后,显示了GC花费的时间,其中user表示用户态CPU耗时,sys表示系统CPU耗时,real表示GC实际经历时间;
- 在该示例中,当前新生代总大小为9792KB,已经使用4586KB。紧跟其后的3个16进制数字表示新生代的下界,当前上界和上界;
- 使用上界减去下界就能得到当前堆空间的最大值,使用当前上界减去下界,就是当前虚拟机已经为程序分配的空间大小;
- 如果当前上界等于下界,说明当前的堆空间已经没有扩大的可能;
-XX:+PrintHeapAtGC:它会在每次GC前后分别打印堆的信息,如同-XX:+PrintGCDetails的最后输出一样;
图示:部分输出样式
-XX:PrintGCTimeStamps:该参数会在每次GC发生时,额外输出GC发生的时间,该输出时间为虚拟机启动后的时间偏移量
图示:下图表示在系统启动后0.08秒,0.088秒,0.094秒发生了3次GC;
-XX:+PrintGCApplicationConcurrentTime:由于GC会引起应用程序停顿,还使用此参数打印应用程序的执行时间;
-XX:+PrintGCApplicationStoppedTIme:用来打印应用程序由于GC而产生的停顿时间;
-XX:+PrintReferenceGC:用来跟踪系统内的软引用,弱引用,虚引用和Finallize队列;
-Xlogge:指定虚拟机将GC日志,以文件形式输出;
如:-Xloggc:log/gc.log启动虚拟机,可以在当前目录下的log文件夹下的gc.log文件中记录所有的GC日志,如下图:
类的加载/卸载的跟踪
-verbose:class:跟踪类的加载和卸载;
- -XX:+TraceClassLoading:只跟踪类的加载;
- -XX:+TraceClassUnLoading:只跟踪类的卸载;
-XX:+PrintClassHistogram:在运行时打印系统中类的分布情况情况;在系统启动时,加上此参数,然后在Java的控制台中按下Ctrl+Break组合键,控制台就会显示当前的类信息柱状图;
查看系统参数
-XX:+PrintVMOptions:可在程序运行时,打印虚拟机接受到的命令行显示参数,输入如下:
说明:虚拟机启动时,命令行明确指定了UseSerialGC,DisableExplicitGC两个参数;
-XX:+PrintCommandLineFlags:可以打印传递给虚拟机的显示和隐式参数,隐式参数未必是通过命令行直接给出的,可能是由虚拟机启动时自行设置的;
图示:可能的一种输出结果:
-XX:+PrintFlagsFinal:它会打印所有的系统参数的值
虚拟机工作模式
能力:虚拟机支持两种Client和Server两种运行模式。通过-client启用前者,通过-server启用后者。默认,虚拟机会根据当前计算机系统环境自行选择运行模式;
属性:
-version:查看当前模式
启用-server模式:
-XX:PrintFlagsFinal:查看两种模式下的不同参数
模式对比:
Server:启动较慢,会收集更多的系统性能信息,使用更复杂的算法对程序进行优化。当程序运行稳定后,该模式的速度远快于Client模式;
- 64位系统中,虚拟机更倾向于使用Server;
- 系统最大堆约为1GB;
Client:适用于用户界面,运行时间不长,追求启动速度;系统最大堆,约为256MB;