Jvm 内存调优命令行

JVM常用参数

JVM组成

堆大小设置

原文链接

java -server -Xmx4g -Xms4g -Xmn2g –Xss128k

-Xmx4g :设置JVM最大可用内存为4g。
-Xms4g :设置JVM最小可用内存为4g。一般配置为与-Xmx相同,避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g :设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小,所以增大年轻代后,将会减小年老代大小。
-Xss128k :设置每个线程的堆栈大小。JDK5.0以后每个线程默认大小为1M,以前每个线程大小为256K。根据应用的线程所需内存大小进行调整。

java -server -Xmx4g -Xms4g -Xmn2g –Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxMetaspaceSize=16m -XX:MaxTenuringThreshold=0

-XX:NewRatio=4 : 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4 : 设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxMetaspaceSize=16m : 设置元空间最大可分配大小为16m。
-XX:MaxTenuringThreshold=0 : 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

GC日志打印

-XX:+PrintGC

输出形式:

[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails

输出形式:

[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

日志内容解析

OOM生成dump文件

-XX:+HeapDumpOnOutOfMemoryError :表示jvm发生oom异常时,自动生成dump文件
-XX:HeapDumpPath= :表示生成dump文件的存放目录

JVM常用参数

内存溢出排查

一般来说内存溢出主要分为以下几类:

  • 堆溢出(java.lang.OutOfMemoryError: Java heap space)
  • 栈深度不够( java.lang.StackOverflowError)
  • 栈线程数不够(java.lang.OutOfMemoryError: unable to create new native thread)
  • 元空间溢出(java.lang.OutOfMemoryError: Metaspace)

元数据空间的大小
在Java 在8和之前的版本中,永久代的尺寸是固定的,JVM的启动参数-XX:PermSize-XX:MaxPermSize配置。默认情况下,-XX:PermSize和-XX:MaxPermSize值均为64MB。

然而,在Java 8.在后续版本中,元空间的大小是动态的,不再局限于固定的大小。元空间的大小由JVM的启动参数组成-XX:MetaspaceSize-XX:MaxMetaspaceSize配置。默认情况下,-XX:MetaspaceSize值为21MB,而-XX:MaxMetaspaceSize值是无限大的。

堆溢出

栈内存大小的默认值通常为 512KB 到 1024KB 之间。。-Xmx2g -Xms512m可配置

堆溢出(java.lang.OutOfMemoryError: Java heap space)

是常见也是最复杂的一种情况。导致堆溢出可能的情况有:

  • 堆内存配置太小
  • 超出预期的访问量:访问量飙升
  • 超出预期的数据量:系统中是否存在一次性提取大量数据到内存的代码
  • 一次性申请内存太多:更改申请对象的内存数量
  • 内存资源耗尽未释放(内存泄漏):找到未释放的内存对象进行释放
  • 本身资源不够:jmap -heap可查看堆信息

解决方法:

  • 增加堆内存大小:可以通过启动JVM时设置-Xms(堆的起始大小)和-Xmx(堆的最大大小)参数来增加堆内存。例如:java -Xms512m -Xmx1024m YourApplication.jar
  • 分析内存泄漏:使用VisualVM的内存分析器来查找内存泄漏。这可能需要你先生成一个堆转储(Heap Dump),然后分析这个转储文件。
  • 优化代码:检查代码中可能导致内存泄漏的地方,例如无效的引用、缓存管理不当等。
  • 使用更高效的数据结构:例如使用数组代替列表,使用StringBuilder代替字符串连接等。
  • 配置垃圾收集器:通过调整垃圾收集器的行为和参数来优化内存回收,例如调整新生代与老年代的大小比例等。
  • 使用外部资源:如果应用程序需要处理大量数据,可以考虑使用数据库或者其他外部资源来缓存一些不需要始终保留的数据。

解决思路一般是:

一、 堆dump文件获取

  1. 通过参数配置自动获取dump文件(推荐)
  2. jmap -dump:format=b,file=filename.hprof pid

二、MAT工具分析

  • 用VisualVM分析大对象、堆中存储信息、可能存在的内存泄漏地方,便于定位问题位置
  • MAT(Memory Analyzer Tool) 定位堆内存溢出问题

栈深度不够

引发StackOverFlowError的常见原因有:

  • 无限循环递归调用
  • 同一时间执行大量方法,资源耗尽
  • 方法中声明大量局部变量
  • 其它消耗栈资源的方法
  • xss配置太小导致

栈线程数不够

出现较少

linux系统中非root用户默认创建线程数最多是1024。
解决办法是修改文件:/etc/security/limits.d/90-nproc.conf

还有一种情况是-xss配置太大,那么操作系统可创建的最大线程数太小导致,一般除非误操作是不会出现此问题的。

元空间溢出

Metaspace元空间主要是存储类的元数据信息,各种类描述信息,比如类名、属性、方法、访问限制等,按照一定的结构存储在Metaspace里。
一般来说,元空间大小是固定不变的。在出现溢出后,首先通过命令或监控工具(如下图)查看元空间大小,再检查是否-XX:MaxMetaspaceSize配置太小导致。

jstat -gc pid

在这里插入图片描述

如果发现元空间大小是持续上涨的,则需要检查代码是否存在大量的反射类加载、动态代理生成的类加载等导致。

可以通过-XX:+TraceClassLoading -XX:+TraceClassUnloading记录下类的加载和卸载情况,反推具体问题代码。

JVM监控

常用的监控工具或命令有:jstack、jstat、jConsole、jvisualvm。监控指标主要是各内存区域大小是否合理、fullGC频率及耗时、youngGC耗时、线程数等。

jstack

jstack主要用于打印线程堆栈信息,帮助问题的定位。

是当前Java虚拟机中每个线程正在执行的Java线程、虚拟机内部线程和可选的本地方法堆栈帧的集合。对于每个方法栈帧,将会显示完整的类名、方法名、字节码索引(bytecode index,BCI)和行号。生成的线程快照可以用于定位线程出现长时间停顿的原因,比如:线程间死锁、死循环、请求外部资源被长时间挂起等等。

语法 :

jstack [options] pid

option:jstack命令的可选参数。如果没有指定这个参数,jstack命令会显示Java虚拟机当前时刻的线程快照信息,如下图:

C:\Users\20201103>jstack  12864
2023-07-28 11:16:28
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.91-b15 mixed mode):

"Druid-ConnectionPool-Destroy-1158676965" #40 daemon prio=5 os_prio=0 tid=0x000001a8840b5000 nid=0x73f8 waiting on condition [0x0000006fa0bff000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:2824)

"Druid-ConnectionPool-Create-1158676965" #39 daemon prio=5 os_prio=0 tid=0x000001a8840b2800 nid=0x8680 waiting on condition [0x0000006fa0afe000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006c2269c78> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2728)

"OracleTimeoutPollingThread" #38 daemon prio=10 os_prio=2 tid=0x000001a8840b0800 nid=0x80f8 waiting on condition [0x0000006fa09ff000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at oracle.jdbc.driver.OracleTimeoutPollingThread.run(OracleTimeoutPollingThread.java:148)
状态/动作描述
New当线程对象创建时存在的状态,此时线程不可能执行
Runnable当调用thread.start()后,线程变成为Runnable状态, 也就是就绪状态。只要得到CPU,就可以执行
Running线程正在执行
Waiting执行thread.join()或在锁对象调用obj.wait()等情况就会进该状态,表明线程正处于等待某个资源或条件发生来唤醒自己
Timed_Waiting执行Thread.sleep(long)、thread.join(long)或obj.wait(long)等就会进该状态,与Waiting的区别在于Timed_Waiting的等待有时间限制
Dead线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,表示该线程结束
Deadlock表示有死锁

option 常用参数 :

  • -F :如果Java虚拟机进程由于进程挂起而没有任何响应,那么可以使用-F参数(仅在Oracle Solaris和Linux操作系统上游戏)强制显示线程快照信息。
  • -l参数,除了方法栈帧以外,jstack命令还会显示关于锁的附加信息,比如属于java.util.concurrent的ownable synchronizers列表。
  • -m参数 ;jstack命令将显示混合的栈帧信息,除了Java方法栈帧以外,还有本地方法栈帧。本地方法栈帧是C或C++编写的虚拟机代码或JNI/native代码。
  • -h 和 -help :显示jstack命令的帮助信息。

虽然jstack命令已经推出很久并且使用频率比较搞,但它仍然是一个“实验性质的,并且没有技术支持的”(Experimental and Unsupported)工具,日后可能会被转正,也有可能在某个JDK版本中无声无息地消失。

不过,我们还可以使用Thread.getAllStackTracesgetAll()方法,获取Java虚拟机中所有线程的StackTraceElement对象,进而获得所有线程栈帧信息。

Linux中可配合top -Hp PID使用。

通过top -Hp PID命令可以看到占用CPU比较高的线程,如图:

在这里插入图片描述

jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。

命令的格式如下:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

option 可用参数 :

  • -class用于查看类加载情况的统计
  • -compiler 用于查看HotSpot中即时编译器编译情况的统计
  • -gc 用于查看JVM中堆的垃圾收集情况的统计
  • -gccapacity 用于查看新生代、老生代及持久代的存储容量情况
  • -gcmetacapacity 显示metaspace的大小
  • -gcnew 用于查看新生代垃圾收集的情况
  • -gcnewcapacity 用于查看新生代存储容量的情况
  • -gcold 用于查看老生代及持久代垃圾收集的情况
  • -gcoldcapacity 用于查看老生代的容量
  • -gcutil 显示垃圾收集信息
  • -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次仅当前正在发生的垃圾收集的原因
  • -printcompilation 输出JIT编译的方法信息

outputOptions:输出选项,用于设置 jstat 命令的输出格式。可以是以下选项之一:

  • -t:输出时间戳。
  • -h:输出帮助信息。
    -J:输出完整的 JVM 内部信息。

vmid:Java 虚拟机进程 ID 或进程名。

interval:指定采样间隔时间,默认单位是毫秒。可以使用 s 或 ms 后缀指定单位,例如 10s 或 500ms。
count:指定采样次数,默认是无限次。

输出参数内容:

S0  — Heap上的 Survivor space 0 区已使用空间的百分比 
S0C:S0当前容量的大小 
S0U:S0已经使用的大小 
S1  — Heap上的 Survivor space 1 区已使用空间的百分比 
S1C:S1当前容量的大小 
S1U:S1已经使用的大小 
E   — Heap上的 Eden space 区已使用空间的百分比 
EC:Eden space当前容量的大小 
EU:Eden space已经使用的大小 
O   — Heap上的 Old space 区已使用空间的百分比 
OC:Old space当前容量的大小 
OU:Old space已经使用的大小 
P   — Perm space 区已使用空间的百分比 
OC:Perm space当前容量的大小 
OU:Perm space已经使用的大小 
YGC — 从应用程序启动到采样时发生 Young GC 的次数 
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) 
FGC — 从应用程序启动到采样时发生 Full GC 的次数 
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) 
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC 

-class: 类加载统计

C:\Users\20201103>jstat -class -t -h3 12864 1000
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
        86154.2  13828 26028.9        0     0.0      35.29
        86155.3  13828 26028.9        0     0.0      35.29
        86156.3  13828 26028.9        0     0.0      35.29
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
        86157.3  13828 26028.9        0     0.0      35.29
        86158.3  13828 26028.9        0     0.0      35.29
        86159.3  13828 26028.9        0     0.0      35.29

Loaded :加载class的数量
Bytes :所占用空间大小
Unloaded :未加载数量
Bytes :未加载占用空间

-h3 : 多少行打印一次头部
1000 多久刷新一次 ms

-compiler 编译统计 :

C:\Users\20201103>jstat -compiler -t 12864
Timestamp       Compiled Failed Invalid   Time   FailedType FailedMethod
        85797.7     7926      0       0    70.82          0

Compiled:编译数量
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法

垃圾回收情况统计 -gc :

C:\Users\20201103>jstat -gc  -h3 12864 1000
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
30208.0 37376.0 30195.5  0.0   689152.0 336961.7  244736.0   40201.7   68352.0 65554.9 8960.0 8437.7     16    0.266   3      0.400    0.667
30208.0 37376.0 30195.5  0.0   689152.0 336961.7  244736.0   40201.7   68352.0 65554.9 8960.0 8437.7     16    0.266   3      0.400    0.667
30208.0 37376.0 30195.5  0.0   689152.0 336961.7  244736.0   40201.7   68352.0 65554.9 8960.0 8437.7     16    0.266   3      0.400    0.667
  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:Young GC 的次数
  • YGCT:Young GC 所用的时间(单位秒)
  • FGC:发生 Full GC 的次数
  • FGCT:Full GC 所用的时间(单位秒)
  • GCT:垃圾回收的总时间(单位秒)

堆内存统计 -gccapacity

C:\Users\20201103>jstat -gccapacity  -h3 12864 1000
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 87040.0 1390592.0 780288.0 30208.0 37376.0 689152.0   175104.0  2781184.0   244736.0   244736.0      0.0 1107968.0  68352.0      0.0 1048576.0   8960.0     16     3
 87040.0 1390592.0 780288.0 30208.0 37376.0 689152.0   175104.0  2781184.0   244736.0   244736.0      0.0 1107968.0  68352.0      0.0 1048576.0   8960.0     16     3
 87040.0 1390592.0 780288.0 30208.0 37376.0 689152.0   175104.0  2781184.0   244736.0   244736.0      0.0 1107968.0  68352.0      0.0 1048576.0   8960.0     16     3
  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0C:第一个幸存区大小
  • S1C:第二个幸存区的大小
  • EC:伊甸园区的大小
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:当前老年代大小
  • MCMN:最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:Young GC 的次数
  • FGC:发生 Full GC 的次数

新生代垃圾回收统计 -gcnew

C:\Users\20201103>jstat -gcnew  -h3 12864 1000
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
30208.0 37376.0 30195.5    0.0  2  15 37376.0 689152.0 336961.7     16    0.266
30208.0 37376.0 30195.5    0.0  2  15 37376.0 689152.0 336961.7     16    0.266
30208.0 37376.0 30195.5    0.0  2  15 37376.0 689152.0 336961.7     16    0.266
  • S0C:第一个幸存区大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • TT:对象在新生代存活的次数
  • MTT:对象在新生代存活的最大次数
  • DSS:期望的幸存区大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • YGC:Young GC 的次数
  • YGCT:Young GC 所用的时间(单位秒)

新生代内存统计 gcnewcapacity

C:\Users\20201103>jstat -gcnewcapacity   -h3 12864 1000
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   87040.0  1390592.0   780288.0 463360.0  30208.0 463360.0  37376.0  1389568.0   689152.0    16     3
   87040.0  1390592.0   780288.0 463360.0  30208.0 463360.0  37376.0  1389568.0   689152.0    16     3
   87040.0  1390592.0   780288.0 463360.0  30208.0 463360.0  37376.0  1389568.0   689152.0    16     3
  • NGCMN:新生代最小容量
  • NGCMX:新生代最大容量
  • NGC:当前新生代容量
  • S0CMX:最大幸存1区大小
  • S0C:当前幸存1区大小
  • S1CMX:最大幸存2区大小
  • S1C:当前幸存2区大小
  • ECMX:最大伊甸园区大小
  • EC:当前伊甸园区大小
  • YGC:Young GC 的次数
  • FGC:发生 Full GC 的次数

老年代垃圾回收统计 gcold

C:\Users\20201103>jstat -gcold   -h3 12864 1000
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
 68352.0  65554.9   8960.0   8437.7    244736.0     40201.7     16     3    0.400    0.667
 68352.0  65554.9   8960.0   8437.7    244736.0     40201.7     16     3    0.400    0.667
 68352.0  65554.9   8960.0   8437.7    244736.0     40201.7     16     3    0.400    0.667
  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • YGC:Young GC 的次数
  • FGC:发生 Full GC 的次数
  • FGCT:Full GC 所用的时间(单位秒)
  • GCT:垃圾回收的总时间(单位秒)

老年代内存统计 gcoldcapacity

C:\Users\20201103>jstat -gcoldcapacity    -h3 12864 1000
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
   175104.0   2781184.0    244736.0    244736.0    16     3    0.400    0.667
   175104.0   2781184.0    244736.0    244736.0    16     3    0.400    0.667
   175104.0   2781184.0    244736.0    244736.0    16     3    0.400    0.667
  • OGCMN:老年代最小容量
  • OGCMX:老年代最大容量
  • OGC:当前老年代大小
  • OC:老年代大小
  • YGC:Young GC 的次数
  • FGC:发生 Full GC 的次数
  • FGCT:Full GC 所用的时间(单位秒)
  • GCT:垃圾回收的总时间(单位秒)

垃圾回收占比情况统计 gcutil

C:\Users\20201103>jstat -gcutil   -h3 12864 1000
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 99.96   0.00  48.90  16.43  95.91  94.17     16    0.266     3    0.400    0.667
 99.96   0.00  48.90  16.43  95.91  94.17     16    0.266     3    0.400    0.667
 99.96   0.00  48.90  16.43  95.91  94.17     16    0.266     3    0.400    0.667
  • S0:幸存1区当前使用比例
  • S1:幸存2区当前使用比例
  • E:伊甸园区使用比例
  • O:老年代使用比例
  • M:元数据区使用比例
  • CCS:压缩使用比例
  • YGC:Young GC 的次数
  • YGCT:Young GC 所用的时间(单位秒)
  • FGC:发生 Full GC 的次数
  • FGCT:Full GC 所用的时间(单位秒)
  • GCT:垃圾回收的总时间(单位秒)

元数据空间使用统计 gcmetacapacity

C:\Users\20201103>jstat -gcmetacapacity    -h3 12864 1000
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1107968.0    68352.0        0.0  1048576.0     8960.0    16     3    0.400    0.667
       0.0  1107968.0    68352.0        0.0  1048576.0     8960.0    16     3    0.400    0.667
       0.0  1107968.0    68352.0        0.0  1048576.0     8960.0    16     3    0.400    0.667
  • MCMN: 最小元数据容量
  • MCMX:最大元数据容量
  • MC:当前元数据空间大小
  • CCSMN:最小压缩类空间大小
  • CCSMX:最大压缩类空间大小
  • CCSC:当前压缩类空间大小
  • YGC:Young GC 的次数
  • FGC:发生 Full GC 的次数
  • FGCT:Full GC 所用的时间(单位秒)
  • GCT:垃圾回收的总时间(单位秒)

jvm编译方法统计 printcompilation

C:\Users\20201103>jstat -printcompilation    -h3 12864 1000
Compiled  Size  Type Method
    7929     17    1 oracle/jdbc/driver/T4CTypeRep isConvNeeded
    7929     17    1 oracle/jdbc/driver/T4CTypeRep isConvNeeded
  • Compiled:最近编译方法的数量
  • Size:最近编译方法的字节码数量
  • Type:最近编译方法的编译类型
  • Method:方法名标识

jmap

查看堆内存信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况,可以结合jhat使用
主要用于分析OOM

命令:jmap -heap [进程ID]
jmap -dump:format=b,file=HeapDump <pid> : dump出内存信息,可用内存分析工具分析情况

jmap [ option ] pid 
jmap [ option ] executable core 
jmap [ option ] [server-id@]remote-hostname-or-IP 

option 参数 :

-dump :[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件,format=b是通过二进制的意思,file指定输出目录文件
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-h | -help 打印辅助信息
-J 传递参数给jmap启动的jvm.

dump出堆内存信息到文件:

C:\Users\20201103\Desktop>jmap -dump:format=b,file=./test.dat 12864
Dumping heap to C:\Users\20201103\Desktop\test.dat ...
Heap dump file created

错误案例


学习博客记录

jvm参数,tomcat参数,jar包运行参数调优

JVM 参数-D-X-XX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值