jvm调优

一、OOM

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

2.jstat可以观察到classloader,compiler,gc相关信息(jstat命令要找到java/bin的目录)

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

$./jstat -gcutil 2403
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00 100.00 100.00 100.00  95.17  92.86   3956  109.246 19043 51186.901 51296.147

 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命令

  (1) top -H -p pid 

      如果top发现某一个进程占用CPU非常高,可以用此命令进一步查看下面线程的占用情况。一般都会发现前几个有CPU占用特别高的线程。比如2985,(16进制为0xba9)

  (2)下载当前的java线程栈:

      jstack -l pid > ./stack.log

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

 也可以不保存,直接在线程栈信息中去查找,因为信息中都是16进制,所以要把线程号转为16进制再去查:

     jstack  pid | grep -A 20  0xba9  (上述得到的线程号16进制)

    可以得到nid=0xba9的相关的一些信息。

  .....
 
"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命令

(1)jmap -histo:live pid 

       查看当前进程的Java内存占用信息(活跃的)。

(2)dump进程文件:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值