Jstat在分析java的内存GC时的应用

jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。java

执行:cd $JAVA_HOME/bin中执行jstat,注意jstat后必定要跟参数。算法

各个参数的意义。 工具

  •     jstat -class pid:显示加载class的数量,及所占空间等信息。 
  •     jstat -compiler pid:显示VM实时编译的数量等信息。 
  •     jstat -gc pid:能够显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 
  •     jstat -gccapacity:能够显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其余的能够根据这个类推, OC是old内纯的占用量。 
  •     jstat -gcnew pid:new对象的信息。 
  •     jstat -gcnewcapacity pid:new对象的信息及其占用量。 
  •     jstat -gcold pid:old对象的信息。 
  •     jstat -gcoldcapacity pid:old对象的信息及其占用量。 
  •     jstat -gcpermcapacity pid: perm对象的信息及其占用量。 
  •     jstat -util pid:统计gc信息统计。 
  •     jstat -printcompilation pid:当前VM执行的信息。 
  •     除了以上一个参数外,还能够同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还能够加上-h3每三行显示一下标题。
  • 语法结构:   
  • Usage: jstat -help|-options   
  •        jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]   
  • 参数解释:   
  • Options — 选项,咱们通常使用 -gcutil 查看gc状况比较多   
  • vmid    — VM的进程号,即当前运行的java进程号   
  • interval– 间隔时间,单位为秒或者毫秒   
  • count   — 打印次数,若是缺省则打印无数次   
  • 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 — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

如:[root@localhost bin]# jstat -gcutil 25332  1000  10     (25332是java的进程号,ps -ef | grep javaspa

分代概念:对象

分代是Java垃圾收集的一大亮点,根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent,根据不一样代的特色采用不一样的收集算法,扬长避短也。生命周期

Young(Nursery),年轻代。研究代表大部分对象都是朝生暮死,随生随灭的。所以全部收集器都为年轻代选择了复制算法。进程

复制算法优势是只访问活跃对象,缺点是复制成本高。由于年轻代只有少许的对象能熬到垃圾收集,所以只需少许的复制成本。并且复制收集器只访问活跃对象,对那些占了最大比率的死对象视而不见,充分发挥了它遍历空间成本低的优势。内存

Young(年轻代)ci

年 轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区 (两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另一个Survivor区,当这个Survivor去也满了的时候,从第一 个Survivor区复制过来的而且此时还存活的对象,将被复制“年老区(Tenured)”。须要注意,Survivor的两个区是对称的,没前后关 系,因此同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。并且,Survivor区总有一个是空 的。it

Tenured(年老代)

年老代存放从年轻代存活的对象。通常来讲年老代存放的都是生命期较长的对象。

Perm(持久代)

用 于存放静态文件,现在Java类、方法等。持久代对垃圾回收没有显著影响,可是有些应用可能动态生成或者调用一些class,例如Hibernate等, 在这种时候须要设置一个比较大的持久代空间来存放这些运行过程当中新增的类。持久代大小经过-XX:MaxPermSize=进行设置。

Gc的基本概念

gc分为full gc 跟 minor gc,当每一块区满的时候都会引起gc。

Scavenge GC

通常状况下,当新对象生成,而且在Eden申请空间失败时,就触发了Scavenge GC,堆Eden区域进行GC,清除非存活对象,而且把尚且存活的对象移动到Survivor区。而后整理Survivor的两个区。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,所以应该尽量减小Full GC。有以下缘由可能致使Full GC:

Tenured被写满

Perm域被写满

System.gc()被显示调用

上一次GC以后Heap的各域分配策略动态变化

相关文章
相关标签/搜索