排查优化

Posted on By xqw

#常见问题

堆溢出

内存泄漏

-XX:+HeapDumpOnOutOfMemoryError:堆溢出的时候将当时的堆存储情况存下来,GC Root引用链可查出泄露位置 GC Root包括以下几种对象:

  • 虚拟机栈中引用的对象
  • 本地方法栈中JNI引用的对象
  • 方法区中类静态成员变量引用的对象
  • 方法区中常量引用的静态成员变量引用的对象
  • 方法区中常量引用的对象
    常见内存泄漏

内存设置不够

-Xms 初始堆大小 -Xmx 最大堆大小

类型 参数 描述
堆内存大小 -Xms 启动JVM时堆内存的大小
  -Xmx 堆内存最大限制
新生代空间大小 -XX:NewRatio 新生代和老年代的内存比(默认1:2)
  -XX:NewSize 新生代内存大小
  -XX:SurvivorRatio Eden区和Survivor区的内存比(默认8 表示新生代eden:from:to=8:1:1)

常用经典配置

sun公司给的例子是(4G内存,32个线程并发能力)-Xmx3800m -Xms3800m -Xmn2G -Xss128k

分析工具

jps (JVM Process Status Tool)

显示系统内所有HotSpot虚拟机进程

jps -l //显示所有pid和完整启动类
jps -v //显示虚拟机启动参数

jstat (JVM Statistics Momitoring Tool)

收集HotSpot虚拟机进程各方面的运行参数

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

S0C、S1C、S0U、S1U:S0和S1的总量与使用量(S0 和S1 只会启用一个,未启用的会是0)
EC、EU eden区总量与使用量
OC、OU:Old区总量与使用量
MC、MU:Metaspace区总量与使用量
CCSC、CCSU:压缩类空间总量与使用量
YGC、YGCT:YoungGC的次数与时间
FGC、FGCT:FullGC的次数与时间
GCT:总的GC时间

hlkj@hlkj01:~$ jstat -gc 5903
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC         MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
23040.0 24064.0 128.0   0.0   99328.0  24789.0   236544.0   59534.4   81280.0 75349.8 10624.0 9574.2     48    0.990   5      1.160    2.150
hlkj@hlkj01:~$ jstat -gcutil 5903
  S0     S1     E      O      M      CCS      YGC     YGCT    FGC    FGCT     GCT   
  0.56   0.00  39.00  25.17  92.70  90.12     48    0.990     5    1.160    2.150
    

jinfo (Configuration Info for Java)

显示虚拟机配置信息 jinfo pid

jmap (Memory Map for Java)

显示虚拟机内存信息,生成内存转储快照

格式jmap -heap pid

hlkj@hlkj01:~$ jmap -heap 5903
Attaching to process ID 5903, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 536870912 (512.0MB)
   NewSize                  = 44564480 (42.5MB)
   MaxNewSize               = 178782208 (170.5MB)
   OldSize                  = 89653248 (85.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 111673344 (106.5MB)
   used     = 32897408 (31.3734130859375MB)
   free     = 78775936 (75.1265869140625MB)
   29.458603836561032% used
From Space:
   capacity = 4718592 (4.5MB)
   used     = 229376 (0.21875MB)
   free     = 4489216 (4.28125MB)
   4.861111111111111% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 242221056 (231.0MB)
   used     = 66423896 (63.346763610839844MB)
   free     = 175797160 (167.65323638916016MB)
   27.422841389973957% used

33416 interned Strings occupying 3958832 bytes.

生成快照 jmap -dump:live,format=b,file=heap.bin pid

生成 Heap Dump 的几种方式

jhat (JVM Heap Dump Browser)

分析jmap生成的快照,建立一个html服务7000端口 jhat heap.bin

jstack (Stack Trace for Java)

显示虚拟机线程快照 格式jstack [option] pid

可视化jconsole jvisualvm

JVM调优实践