jstat -gccause pid 1 每格1毫秒输出结果
jstat -gccause pid 2000 每格2秒输出结果
不断的在屏幕打印出结果
java
S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC | |
87.71 0.00 94.71 59.45 59.03 20832 1961.089 121 74.676 2035.765 Allocation Failure No GC |
正好对应JVM 的内存分代算法
图中参数含义以下:
S0 — Heap上的 Survivor space 0 区已使用空间的百分比 S1 — Heap上的 Survivor space 1 区已使用空间的百分比 E — Heap上的 Eden space 区已使用空间的百分比 O — Heap上的 Old space 区已使用空间的百分比 P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒) 服务器
1、相关概念多线程
基本回收算法并发
分代垃圾回收详述app
如上图所示,为Java堆中的各代分布。性能
GC类型
GC有两种类型:Scavenge GC和Full GC。测试
2、垃圾回收器优化
目前的收集器主要有三种:串行收集器、并行收集器、并发收集器。spa
使用单线程处理全部垃圾回收工做,由于无需多线程交互,因此效率比较高。可是,也没法使用多处理器的优点,因此此收集器适合单处理器机器。固然,此收集器也能够用在小数据量(100M左右)状况下的多处理器机器上。可使用-XX:+UseSerialGC打开。
并行收集器
对年轻代进行并行垃圾回收,所以能够减小垃圾回收时间。通常在多线程多处理器机器上使用。使用-XX:+UseParallelGC.打开。并行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中进行了加强--能够堆年老代进行并行收集。若是年老代不使用并发收集的话,是使用单线程进行垃圾回收,所以会制约扩展能力。使用-XX:+UseParallelOldGC打开。
1. 使用-XX:ParallelGCThreads=设置并行垃圾回收的线程数。此值能够设置与机器处理器数量相等。
2. 此收集器能够进行以下配置:
§ 最大垃圾回收暂停:指定垃圾回收时的最长暂停时间,经过-XX:MaxGCPauseMillis=指定。为毫秒.若是指定了此值的话,堆大小和垃圾回收相关参数会进行调整以达到指定值。设定此值可能会减小应用的吞吐量。
§ 吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值,经过-XX:GCTimeRatio=来设定,公式为1/(1+N)。例如,-XX:GCTimeRatio=19时,表示5%的时间用于垃圾回收。默认状况为99,即1%的时间用于垃圾回收。
并发收集器能够保证大部分工做都并发进行(应用不中止),垃圾回收只暂停不多的时间,此收集器适合对响应时间要求比较高的中、大规模应用。使用-XX:+UseConcMarkSweepGC打开。
1. 并 发收集器主要减小年老代的暂停时间,他在应用不中止的状况下使用独立的垃圾回收线程,跟踪可达对象。在每一个年老代垃圾回收周期中,在收集初期并发收集器会 对整个应用进行简短的暂停,在收集中还会再暂停一次。第二次暂停会比第一次稍长,在此过程当中多个线程同时进行垃圾回收工做。
2. 并发收集器使用处理器换来短暂的停顿时间。在一个N个处理器的系统上,并发收集部分使用K/N个可用处理器进行回收,通常状况下1<=K<=N/4。
3. 在只有一个处理器的主机上使用并发收集器,设置为incremental mode模式也可得到较短的停顿时间。
4. 浮动垃圾:因为在应用运行的同时进行垃圾回收,因此有些垃圾可能在垃圾回收进行完成时产生,这样就形成了“Floating Garbage”,这些垃圾须要在下次垃圾回收周期时才能回收掉。因此,并发收集器通常须要20%的预留空间用于这些浮动垃圾。
5. Concurrent Mode Failure:并发收集器在应用运行时进行收集,因此须要保证堆在垃圾回收的这段时间有足够的空间供程序使用,不然,垃圾回收还未完成,堆空间先满了。这种状况下将会发生“并发模式失败”,此时整个应用将会暂停,进行垃圾回收。
6. 启动并发收集器:由于并发收集在应用运行时进行收集,因此必须保证收集完成以前有足够的内存空间供程序使用,不然会出现“Concurrent Mode Failure”。经过设置-XX:CMSInitiatingOccupancyFraction=指定还有多少剩余堆时开始执行并发收集
2. 小结
o 串行处理器:
--适用状况:数据量比较小(100M左右);单处理器下而且对响应时间无要求的应用。
--缺点:只能用于小型应用
o 并行处理器:
--适用状况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。
--缺点:应用响应时间可能较长
o 并发处理器:
--适用状况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。
3、常见配置举例
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
4、调优总结
减小年轻代和年老代花费的时间,通常会提升应用的效率