jmap命令

一、jmap -heap PID

using parallel threads in the new generation.  ##新生代采用的是并行线程处理方式

using thread-local object allocation.   

Concurrent Mark-Sweep GC   ##同步并行垃圾回收

Heap Configuration:  ##堆配置情况

MinHeapFreeRatio = 40 ##最小堆使用比例

MaxHeapFreeRatio = 70 ##最大堆可用比例

MaxHeapSize      = 2147483648 (2048.0MB) ##最大堆空间大小

NewSize          = 268435456 (256.0MB) ##新生代分配大小

MaxNewSize       = 268435456 (256.0MB) ##最大可新生代分配大小

OldSize          = 5439488 (5.1875MB) ##老生代大小

NewRatio         = 2  ##新生代比例

SurvivorRatio    = 8 ##新生代与suvivor的比例

PermSize         = 134217728 (128.0MB) ##perm区大小

MaxPermSize      = 134217728 (128.0MB) ##最大可分配perm区大小

Heap Usage: ##堆使用情况

New Generation (Eden + 1 Survivor Space):  ##新生代(伊甸区 + survior空间)

capacity = 241631232 (230.4375MB)  ##伊甸区容量

used     = 77776272 (74.17323303222656MB) ##已经使用大小

free     = 163854960 (156.26426696777344MB) ##剩余容量

32.188004570534986% used ##使用比例

Eden Space:  ##伊甸区 

capacity = 214827008 (204.875MB) ##伊甸区容量

used     = 74442288 (70.99369812011719MB) ##伊甸区使用

free     = 140384720 (133.8813018798828MB) ##伊甸区当前剩余容量

34.65220164496263% used ##伊甸区使用情况

From Space: ##survior1区

capacity = 26804224 (25.5625MB) ##survior1区容量

used     = 3333984 (3.179534912109375MB) ##surviror1区已使用情况

free     = 23470240 (22.382965087890625MB) ##surviror1区剩余容量

12.43827838477995% used ##survior1区使用比例

To Space: ##survior2 区

capacity = 26804224 (25.5625MB) ##survior2区容量

used     = 0 (0.0MB) ##survior2区已使用情况

free     = 26804224 (25.5625MB) ##survior2区剩余容量

0.0% used ## survior2区使用比例

concurrent mark-sweep generation: ##老生代使用情况

capacity = 1879048192 (1792.0MB) ##老生代容量

used     = 30847928 (29.41887664794922MB) ##老生代已使用容量

free     = 1848200264 (1762.5811233520508MB) ##老生代剩余容量

1.6416783843721663% used ##老生代使用比例

Perm Generation: ##perm区使用情况

capacity = 134217728 (128.0MB) ##perm区容量

used     = 47303016 (45.111671447753906MB) ##perm区已使用容量

free     = 86914712 (82.8883285522461MB) ##perm区剩余容量

35.24349331855774% used ##perm区使用比例

jmap -histo:live强制执行了下full gc

二、JVM 优化的参数设

1、堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx=512m

2、年轻代大小可以通过 -Xmn 来设置,比如-Xmn=2g 或者 -Xmn512m,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

3、年老代大小 = 堆大小 – 年轻代大小

4、持久代或者永久代大小可以通过 -XX:PermSize 和 -XX:MaxPermSize 来控制

5、-XX:SurvivorRatio 控制 Eden和Survivor的内存占用比例,默认为8

     如果设置了NewRatio,那么整个堆空间的1/(NewRatio +1)就是新生代空间的大小,-XX:NewRatio推荐2到4.

    如果同时指定了NewRatio和NewSize,你应该使用更大的那个。于是,当堆空间被创建时,你可以用过下面的表达式计算初始新生代空间的大小:

 
min(MaxNewSize, max(NewSize, heap/(NewRatio+1)))

 三、JVM内存溢出配置

    如何能在JVM遇到OOM错误的时候能够打印heap dump?可以设置-XX:+HeapDumpOnOutOfMemoryError参数,让JVM在探测到内存OOM的时候打印dump。但是在JVM启动参数添加这个参数的时候,JVM启动失败:Unrecognized VM option '+HeapDumpOnOutOfMemeryError' ,问题的原因是因为没有添加-XX:HeapDumpPath参数配置。-XX:HeapDumpPath这个参数可以设置dump文件的存放位置。将JVM启动参数设置成如下格式:

      -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/  

问题得到解决。当JVM发生内存溢出的时候,会在C:/下打印出heap dump

四、JVM调优经验

  (1)调优前/后gc情况可以通过如下命令:jstat -gcutil <pid> 3000

          minor gc: 3~6次/3秒

          full gc: 1次/30秒

  (2)常用参数设置

    UseParNewGC表示对新生代采用并行gc;

    ParallelGCThreads表示并行的线程数为8,一般是cpu的核个数,当核个数大于8时可能不是很适用;

    UseConcMarkSweepGC表示对full gc采用CMS gc;

   -XX:+DisableExplicitGC 表示禁止显式gc,System.gc()

   -XX:+UseCMSCompactAtFullCollection 适用于CMS gc,表示在进行gc的同时清理内存碎片,但会加长gc的总时间

   -XX:CMSInitiatingOccupancyFraction=80 适用于CMS gc,表示在年老代达到80%使用率时马上进行回收

在JVM Crash时获heap信息的一些配置参数:

  -XX:ErrorFile=./xxx.log   JVM Crash时记录heap信息

  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./yyy.log JVM OOM时记录heap信息

原文地址:https://www.cnblogs.com/moonandstar08/p/4924602.html