1 GC日志中Times代表什么意思?
2015-05-26T14:45:37.987-0200 : 151.126 : [GC [PSYoungGen: 142816K->10752K(142848K)] 246648K->243136K(375296K),0.0935090secs][Times: user=0.55,sys=0.10, real=0.09secs]
2015-05-26T14:45:37.987-0200 : GC事件(GC event)开始的时间点。对应参数:-XX:+PrintGCDateStamps
151.126 : GC时间的开始时间,相对于JVM的启动时间,单位是秒(Measured in seconds)。对应参数:XX:+PrintGCTimeStamps
user是用户态耗费的时间(单核CPU用时),sys是内核态耗费的时间(单核CPU用时),real是整个过程实际花费的时间。
它显示了GC运行的“真实”时间(0.09秒是0.0929090秒的近似值)。如果CPU时间(译者注:0.55秒+0.10秒)明显多于”真实“时间(译者注:0.09秒),我们可以得出结论:GC使用了多线程运行。这样的话CPU时间就是所有GC线程所花费的CPU时间的总和。实际上我们的例子中的垃圾收集器使用了8个线程。
例: [GC (Allocation Failure) 151.126: [DefNew: 629119K->69888K(629120K), 0.0584157 secs] 1619346K->1273247K(2027264K), 0.0585007 secs][Times: user=0.06 sys=0.00, real=0.06 secs] .由于垃圾收集器是DefNew,使用单个线程, 所以 real time 等于 user 以及 system time 的总和,没有延迟程序的耗时。
real 从程序开始到程序执行结束时所消耗的时间,包括CPU的用时和所有延迟程序执行的因素的总和。
cpu用时被划分为user和sys两块。user表示程序本身,以及它所调用的库中的子例程使用的时间。sys是由程序直接或间接调用的系统调用执行的时间。
real=cpu用时+其他因素时间,
cpu用时=user+sys
所以: real >= user + sys (单核情况)
在多处理器的系统上,一个进程如果有多个线程或者有多个子进程可能导致Real time比CPU time(User + Sys time)要小,这是因为不同的线程或进程可以并行执行。( http://blog.sciencenet.cn/blog-830496-782593.html )
2 合适的调整新生代的大小(Xmn)
-Xmn 设置新生代大小。等价于 设置 -XX:NewSize和 -XX:MaxNewSize 这两个参数
新生代太小导致Mionr的频率大幅上升,也会导致大量对象进入旧生代,触发FullGC。
新生代太大,导致老生代太小,FullGC频率上升,也有可能导致MinorGC的时间上升。
官方推荐配置为整个堆的3/8
3 Xms和Xmx
JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉