jvm调优

放肆的年华 提交于 2019-11-27 12:43:14

一、OOM

1.top 的时候发现负载很高

2.jstat可以观察到classloader,compiler,gc相关信息

  jstat -gcutil  pid 查看各个区的占比,和gc的次数。244023

a-6c96cfe061ff:aa user$ jstat -gcutil 6864
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  93.75  50.27  59.64  97.38  94.67     47    0.762     5    0.858    1.620

 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 — 从应用程序启动到采样时用于垃圾回收的总时

    jstat -class 6864 可以查看

a-6c96cfe061ff:user$ jstat -class 6864
Loaded  Bytes  Unloaded  Bytes     Time   
 25615 49806.6        1     1.6     177.26

  Loaded 加载的类的数量。
  Bytes 加载的字节数。
  Unloaded 卸载的类的数量。
  Bytes 卸载的字节数。
  Time 执行类加载和卸载操作所花费的时间

   jstat -compiler pid

a-6c96cfe061ff:user$ jstat -compiler 6864
Compiled Failed Invalid   Time   FailedType FailedMethod
   15453     16       0     5.57          1 com/fastjson/parser/deserializer/JavaBeanDeserializer deserialze

 Compiled 已编译执行的编译任务数。
 Failed 失败的编译任务数目。
 Invalid 无效的编译任务数目。
 Time 执行编译任务所花费的时间。
 FailedType 上次编译失败的类型。
 FailedMethod 失败的方法类名和上次编译失败的方法

3.jstack命令

  下载当前的java线程栈:

      jstack -l pid > ./stack.log

   把进程的线程栈信息导入到当前目录的stack.log文件中。

  .....
 
"main" #1 prio=5 os_prio=31 tid=0x00007fe08a019000 nid=0x1b03 in Object.wait() [0x0000700000635000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000006c0e8c848> (a java.lang.Thread)
	at java.lang.Thread.join(Thread.java:1252)
	- locked <0x00000006c0e8c848> (a java.lang.Thread)
	at java.lang.Thread.join(Thread.java:1326)
	at com.taobao.pandora.boot.loader.LaunchRunner.join(LaunchRunner.java:60)
	at com.taobao.pandora.boot.loader.ReLaunchMainLauncher.reLaunch(ReLaunchMainLauncher.java:107)
	at com.taobao.pandora.boot.loader.ReLaunchMainLauncher.launch(ReLaunchMainLauncher.java:40)
	at com.taobao.pandora.boot.PandoraBootstrap.run(PandoraBootstrap.java:51)
	at com.cainiao.arrow.Application.main(Application.java:22)

   Locked ownable synchronizers:
	- None

"VM Thread" os_prio=31 tid=0x00007fe088030800 nid=0x3403 runnable 

"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fe08a800800 nid=0x2403 runnable 

"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fe08a801800 nid=0x2603 runnable 

"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fe08a81c800 nid=0x2803 runnable 

"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fe08a025000 nid=0x2a03 runnable 

"GC task thread#4 (ParallelGC)" os_prio=31 tid=0x00007fe08a025800 nid=0x2c03 runnable 

"GC task thread#5 (ParallelGC)" os_prio=31 tid=0x00007fe08a026000 nid=0x2e03 runnable 

"GC task thread#6 (ParallelGC)" os_prio=31 tid=0x00007fe08a026800 nid=0x3003 runnable 

"GC task thread#7 (ParallelGC)" os_prio=31 tid=0x00007fe08a027800 nid=0x3203 runnable 

"VM Periodic Task Thread" os_prio=31 tid=0x00007fe08d00b800 nid=0x6003 waiting on condition 

JNI global references: 69982

4.jmap命令

 dump进程文件:

 top或者 ps -ef | grep java 得到当前的目标进程pid,然后用jmap命令导出整个JVM 中内存堆信息:

jmap -dump:format=b,file=./dump.out 6864

然后用eclipse Memory Analyzer或其他分析器分析。 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!