修改JVM的参数、Jstat、Jstack、gclog

---恢复内容开始---

1. jetty 修改JVM的参数

[html] view plain copy
 
  1. deploy/bin/env.sh  


在上面的环境变量脚本中进行修改;如果分配给JVM的内存是4g

这个里面的JAVA_OPTS 的配置项就是用来给JVM 进行配置的;

  • Xms:初始Head 内存的大小,应用使用的最小内存
  • Xmx:Heap 内存的最大值 
  • -XX:NewSize=1024m -XX:MaxNewSize=1024m:新生代内存的大小,一般分配NewSize是Xms的 1/4 ---1/8
  • -XX:PermSize=160m -XX:MaxPermSize=160m :永生代内存的大小,一般是用来加载 静态文件的,只要比最大的静态文件多个10--20% 的bufffer 即可
  • -XX:+UseParallelGC :GC的方式选择并行方式,GC 时消耗性能比较少
  • -Xloggc:/home/.../logs/gc.log  #启动gclog ,会把JVM 每次gc的信息打印到gc.log 里面

  其他还有很多变量;java的内存分为 young old perf    当三个内存来回切换频繁是,会多长GC 就是垃圾回收;会影响我们的性能。

2. JVM 参数详解:

http://singleant.iteye.com/blog/1308842 

http://aixiangct.blog.163.com/blog/static/915224612010101833230342/

JVM 参数设置经验:

http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

3. JVM 信息查看工具命令

jstat 查看 GC 的信息  【选项:-gcutil】 查看gc的信息

[html] view plain copy
 
  1.   sudo -u admin jstat -gcutil 6245 3000    
  2.   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT     
  3.   0.00  21.03  33.28   6.66  62.39     31    0.987     0    0.000    0.987  
  4.   0.00  13.06  91.34   7.53  62.63     39    1.094     0    0.000    1.094  
  5.   0.00  13.06  98.36   7.53  62.63     39    1.094     0    0.000    1.094  
  6.  11.05   0.00   6.25   7.59  62.65     40    1.104     0    0.000    1.104  
  7.  11.05   0.00  11.10   7.59  62.65     40    1.104     0    0.000    1.104  
  8.   
  9. #s0 s1:是内存的2个交换区,如果内存从E(eden 区)转移到O(old 区)时需要借助S0 S1 2个中间交换区转移。  
  10. # E eden :新生代区,java代码中新new的类占用的内存;  
  11. # O old  :老生代区,当新生代区(E)内存占用100时会把E里面的数据迁移到O;当O里面的数据占用内存超过90%时会出发FullGC;在JVM FullGC 期间,java的服务停止服务(大概持续1s的时间);此时如果收到外部的请求会超时:rt  
  12. # P 永久(永生)生代:一般用来加载一些静态数据,java进程启动时会一次性加载,加载之后基本就不变化了。  
  13. # YGC :年轻代(新生代) 进行GC,新生代GC 及时回收内存,代价比较小也比较频繁  
  14. # YGCT:年轻待GC 累加的时间之和(服务重启归0)  
  15. # FGC: 全堆范围内进行GC ,包括YGC 和OGC,每次FGC时java服务暂停,这样代价比较大  
  16. # GCT: 所有的gc的占用的时间  

jmap 查看堆 heap的内存使用情况

[html] view plain copy
 
  1. sudo -u admin jmap -heap 6245         
  2. Attaching to process ID 6245, please wait...  
  3. Debugger attached successfully.  
  4. Server compiler detected.  
  5. JVM version is 20.0-b11  
  6.   
  7. using thread-local object allocation.  
  8. Parallel GC with 8 thread(s)  
  9.   
  10. Heap Configuration:  #JVM 的配置:JAVA_OPTS=" -server   
  11.    MinHeapFreeRatio = 40  
  12.    MaxHeapFreeRatio = 70  
  13.    MaxHeapSize      = 5368709120 (5120.0MB)#整个堆内存的大小    -Xms5g -Xmx5g   
  14.    NewSize          = 1073741824 (1024.0MB)#新生代内存的大小   -XX:NewSize=1024m -XX:MaxNewSize=256m  
  15.    MaxNewSize       = 1073741824 (1024.0MB)  
  16.    OldSize          = 5439488 (5.1875MB)#老生代的内存大小  
  17.    NewRatio         = 2  
  18.    SurvivorRatio    = 2  
  19.    PermSize         = 167772160 (160.0MB)#持久生代 永生代  -XX:PermSize=160m -XX:MaxPermSize=160m  
  20.    MaxPermSize      = 167772160 (160.0MB)  
  21.   
  22. Heap Usage:  
  23. PS Young Generation  
  24. Eden Space:  
  25.    capacity = 1045364736 (996.9375MB)        #NewSize= S0 + S1 + E  
  26.    used     = 289950536 (276.5183792114258MB)  
  27.    free     = 755414200 (720.4191207885742MB)  
  28.    27.7367818154524% used  
  29. From Space:      #S0 S1  
  30.    capacity = 14548992 (13.875MB)  
  31.    used     = 6190208 (5.9034423828125MB)  
  32.    free     = 8358784 (7.9715576171875MB)  
  33.    42.54733248873874% used  
  34. To Space:  
  35.    capacity = 13828096 (13.1875MB)  
  36.    used     = 0 (0.0MB)  
  37.    free     = 13828096 (13.1875MB)  
  38.    0.0% used  
  39. PS Old Generation  
  40.    capacity = 4294967296 (4096.0MB)  #老生代的内存大小 = total heap 大小 - Newsize 大小  
  41.    used     = 369568008 (352.44751739501953MB)  
  42.    free     = 3925399288 (3743.5524826049805MB)  
  43.    8.604675717651844% used  
  44. PS Perm Generation  
  45.    capacity = 167772160 (160.0MB)  #永生代大小  
  46.    used     = 105796384 (100.89529418945312MB)  
  47.    free     = 61975776 (59.104705810546875MB)  
  48.    63.0595588684082% used  

用jstack dump 线程的信息,看当时线程有没有问题;

进程查找所有的线程:top -H -p 进程pid会打印出此进程所有的线程;然后在dump 线程的栈信息

[html] view plain copy
 
  1. sudo -u admin jstack 6245 > stack.log  
  2. #"DubboClientHandler-172.22.6.25:20880-thread-155"   
  3. #daemon prio=10 tid=0x00000000576de800 nid=0x687a waiting on condition [0x000000  
  4. 0054f81000]  

gclog的分析:

[html] view plain copy
 
    1. #前提是在JVM 配置中加入Xloggc的配置:  
    2. -XX:+UseParallelGC -Xloggc:/home/.../.../gc.log  
    3.   
    4. cat gc.log  
    5. #java进程启动到现在的时间(s) GC的类别 GC的减少内存的结果  这次GC 花的时间  
    6. 62802.998: [GC 3152988K->2129998K(5231808K), 0.0241120 secs]  
    7. 62846.660: [GC 3156430K->2133046K(5232896K), 0.0223710 secs]  
    8. 62877.147: [GC 3161142K->2134765K(5232384K), 0.0197390 secs]  
    9.   
    10. #下面这行的含义:  
    11. #62802.998: [GC 3152988K->2129998K(5231808K), 0.0241120 secs]  
    12. #62802.998: #这次gc 从java进程启动到现在执行的时间,单位是秒  
    13. #GC:GC的种类,代表是YGC   如果Full GC 说明是FGC  
    14. #3152988K:这次GC 之前整个堆内存(Heap 占用大小)  
    15. #2129998K:这次GC 之后整个堆内存(Heap 占用大小)  
    16. #也就是这次GC 的效果是释放了(3152988K - 2129998K)内存  
    17. #(5231808K) :代表整个JVM 最大的堆内存 Xmx  
    18. #0.0241120 secs: 此次GC 耗费的时间;如果Full GC 则在这个耗费时间里面java 服务暂停服务 
    19. 原文链接:https://blog.csdn.net/caoshuming_500/article/details/21472997

---恢复内容结束---

原文地址:https://www.cnblogs.com/zh94/p/8783567.html