JDK自带JVM分析工具详解

1. JVM分析工具概述

1.1 JVM分析工具简介

在日常应用开发过程中对JVM状态指标等健康状况的分析是必不可少的操作,尤其是在出现一些内存,GC,线程等问题,JVM分析工具能够很好的帮助我们定位分析问题,我们可以利用jdk自带的jvm分析工具进行分析,比如jps,jinfo,jvisualvm,jconsole,jstat,jstack,jcmd,jmap等。当然也可以采用很多优秀的开源jvm分析工具进行分析,Arthas等。

1.2 JVM分析工具分类

1.jdk自带工具路径:%JAVA_HOME%\jdk1.8.0_151\bin
在这里插入图片描述
2.常见jdk自带jvm分析工具

工具类型作用
jps命令行jvm进程状态工具,列出系统上jvm进程的pid
jinfo命令行jvm信息查看工具,查看jvm的各种配置信息
jvisualvm图形界面jvm综合监控工具,查看jvm基本信息,堆,栈,转储,内存,cpu以及gc等信息
jconsole图形界面jmx兼容的图形工具,用于监控jvm基本情况,查看MBean
jstat命令行jvm统计监控工具,附件到一个jvm进程上手机和记录jvm的各种性能指标数据
jstack命令行jvm栈查看工具,可以查看jvm进程的线程和锁信息
jcmd命令行jvm命令行调试工具,用于向jvm进程发送调试命令
jmap命令行jvm堆内存分析工具,可以查看jvm进程对象直方图,类加载统计以及做堆转储操作

2. JVM分析工具详解

2.1 idea环境配置

启动10个死循环的线程,每个线程分配一个10MB左右的字符串,然后休眠10秒。

public class JvmUtilTest {
    /**
     * JVM测试
     * 启动10个死循环的线程,每个线程分配一个10MB左右的字符串,然后休眠10秒。
     */
    @Test
    public void threadSleep() throws InterruptedException {
        System.out.println("线程启动,执行开始:" + DateUtil.date());
        //启动10个线程
        IntStream.rangeClosed(1, 10).mapToObj(i -> new Thread(() -> {
            while (true) {
                //每一个线程都是一个死循环,休眠10秒,打印10M数据
                String payload = IntStream.rangeClosed(1, 10000000)
                        .mapToObj(__ -> "a")
                        .collect(Collectors.joining("")) + UUID.randomUUID().toString();
                try {
                    TimeUnit.SECONDS.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("第" + i + "线程分配字符串长度:" + payload.length());
            }
        })).forEach(Thread::start);

        //主程序休眠1小时,用来测试
        TimeUnit.HOURS.sleep(1);
        System.out.println("线程结束,执行完成:" + DateUtil.date());
    }
}

idea配置:Edit Configurations->VM Options
-ea -Xms1g -Xmx1g -XX:ThreadStackSize=256k -XX:NativeMemoryTracking=detail
设置堆内存大小:-Xms1g -Xmx1g
开启JVM NMT: -XX:ThreadStackSize=256k -XX:NativeMemoryTracking=detail
在这里插入图片描述

2.2 jps

通过jps查看Java进程列表PID。可以看到JUnitStarter对应pid为21984

D:\software\Java\jdk1.8.0_151\bin>jps
21984 JUnitStarter
20724 Launcher
6148 Jps
8884 KotlinCompileDaemon
18700

2.3 jinfo

通过Java进程对应的pid,使用jinfo查看jvm各种配置信息。比如jdk版本,环境,路径,虚拟机名称,编码,堆栈等信息。VM Flags对应堆栈信息,-XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=1073741824,初始化最大堆内存,刚好与前面设置的堆内存大小相符合1g。

D:\software\Java\jdk1.8.0_151\bin>jinfo 21984
Attaching to process ID 21984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
Java System Properties:

java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.151-b12
sun.boot.library.path = D:\software\Java\jdk1.8.0_151\jre\bin
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = ;
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level =
sun.java.launcher = SUN_STANDARD
user.script =
user.country = CN
user.dir = D:\work\opencode\auto-market
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_151-b12
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = D:\software\Java\jdk1.8.0_151\jre\lib\endorsed
line.separator =

java.io.tmpdir = C:\Users\1\AppData\Local\Temp\
java.vm.specification.vendor = Oracle Corporation
user.variant =
os.name = Windows 10
sun.jnu.encoding = GBK
java.library.path = D:\software\Java\jdk1.8.0_151\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;"D:\software\Java\jdk1.8.0_151\bin;D:\software\Java\jdk1.8.0_151\jre\bin";D:\software\Git\cmd;D:\software\maven\apache-maven-3.6.1\bin;D:\tools\jmeter\apache-jmeter-5.4.1\lib\ext\ApacheJMeter_core.jar;D:\tools\jmeter\apache-jmeter-5.4.1\lib\jorphan.jar;D:\software\Graphviz2.38\bin;D:\software\nodejs\;D:\software\nodejs;C:\Users\1\AppData\Local\Microsoft\WindowsApps;;D:\software\Microsoft VS Code\bin;C:\Users\1\AppData\Roaming\npm;.
jboss.modules.system.pkgs = com.intellij.rt
java.specification.name = Java Platform API Specification
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 10.0
user.home = C:\Users\1
user.timezone = Asia/Shanghai
java.awt.printerjob = sun.awt.windows.WPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
user.name = 1
java.class.path = D:\software\IntelliJ IDEA 2018.1.6\lib\idea_rt.jar;D:\software\Java\jdk1.8.0_151\jre\lib\jfr.jar;D:\software\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;D:\software\maven\.m2\repository\org\springframework\spring-core\5.3.16\spring-core-5.3.16.jar;
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.jerry.market.utils.JvmUtilTest,threadSleep
java.home = D:\software\Java\jdk1.8.0_151\jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.windows.WToolkit
java.vm.info = mixed mode
java.version = 1.8.0_151
java.ext.dirs = D:\software\Java\jdk1.8.0_151\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path = D:\software\Java\jdk1.8.0_151\jre\lib\resources.jar;D:\software\Java\jdk1.8.0_151\jre\lib\rt.jar;D:\software\Java\jdk1.8.0_151\jre\lib\sunrsasign.jar;D:\software\Java\jdk1.8.0_151\jre\lib\jsse.jar;D:\software\Java\jdk1.8.0_151\jre\lib\jce.jar;D:\software\Java\jdk1.8.0_151\jre\lib\charsets.jar;D:\software\Java\jdk1.8.0_151\jre\lib\jfr.jar;D:\software\Java\jdk1.8.0_151\jre\classes;C:\Users\1\.IntelliJIdea2018.1\system\captureAgent\debugger-agent-storage.jar
java.vendor = Oracle Corporation
file.separator = \
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
idea.test.cyclic.buffer.size = 1048576
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.desktop = windows
sun.cpu.isalist = amd64

VM Flags:
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=357564416 -XX:MinHeapDeltaBytes=524288 -XX:NativeMemoryTracking=null -XX:NewSize=357564416 -XX:OldSize=716177408 -XX:ThreadStackSize=262144 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:62405,suspend=y,server=n -ea -Xms1g -Xmx1g -XX:ThreadStackSize=256k -XX:NativeMemoryTracking=detail -Didea.test.cyclic.buffer.size=1048576 -javaagent:C:\Users\1\.IntelliJIdea2018.1\system\captureAgent\debugger-agent.jar=file:/C:/Users/1/AppData/Local/Temp/capture9146.props -Dfile.encoding=UTF-8

2.4 jvisualvm

jvisualvm是一个综合监控工具,查看jvm基本信息,堆,栈,转储,内存,cpu以及gc等信息。

打开图形化界面,找到对应执行方法程序可以查看相关资源配置信息。
概述:Java进程PID,主机IP,主类,参数,jvm名称,版本,以及jvm参数与系统属性。
监视:CPU(使用情况,垃圾回收情况),内存(堆大小,堆使用大小),类(类装入卸载数量),线程(活动线程,守护线程数量)
线程:当前所有线程执行状态,主要包括开启了那些线程,线程运行,休眠,等待,驻留,监视等信息。
抽样器:CPU抽样(CPU样例与线程CPU时间)与内存抽样(堆柱状图与每个线程分配),
Profiler:CPU与内存性能分析。
Visual GC:Spaces与Graphs,Spaces主要包括Metaspace,Old,Eden,S0,S1,Graphs实时分析。需要注意是这个需要以插件的形式安装,工具-插件-可用插件-选择VisualGC安装即可。

visualvm官网地址:https://visualvm.github.io/
xisualvm文档地址:https://visualvm.github.io/documentation.html
visualvm插件下载地址:https://visualvm.github.io/pluginscenters.html

D:\software\Java\jdk1.8.0_151\bin>jvisualvm
D:\software\Java\jdk1.8.0_151\bin>
The launcher has determined that the parent process has a console and will reuse it for its own console output.
Closing the console will result in termination of the running program.
Use '--console suppress' to suppress console output.
Use '--console new' to create a separate console window.

概述,可以看到堆栈信息以及系统参数等。
在这里插入图片描述
监视,可以看到jvmGC大概时间,每10秒回收一次与程序保持一致。我们可以在监视面板看到 JVM 的基本情况,也可以直接在这里进行手动 GC 和堆 Dump 操作。
在这里插入图片描述
线程,可以看到我们开启的线程状态,刚好开启10个线程与程序一致。
在这里插入图片描述
抽样器,可以看到内存或者CPU抽样状态。
在这里插入图片描述Profiler,内存或者CPU抽样性能分析。
在这里插入图片描述
Visual GC,垃圾收集器执行状态以及每个分区大小。
在这里插入图片描述

2.5 jconsole

jconsole如果希望看到各个内存区的 GC 曲线图,可以使用 jconsole 观察。jconsole 也是一个综合性图形界面监控工具,比 jvisualvm 更方便的一点是,可以用曲线的形式监控堆内存,线程,类,以及MBean 中的属性值。
打开jconsole,选择本地进程,测试程序JvmUtilTest

Microsoft Windows [版本 10.0.19044.1586]
(c) Microsoft Corporation。保留所有权利。
D:\software\Java\jdk1.8.0_151\bin>jconsole

在这里插入图片描述

2.6 jstat

jstat工具以命令行的方式,允许以固定的监控频次输出 JVM 的各种监控指标,比如使用 -gcutil 输出 GC 和内存占用汇总信息,每隔 5 秒输出一次,输出 100 次,可以看到 Young GC 比较频繁,而 Full GC 基本 10 秒一次。
jstat 命令的参数众多,包含 -class、-compiler、-gc 等。Java 8、Linux/Unix 平台 jstat 工具的完整介绍,你可以查看这里。jstat 定时输出的特性,可以方便我们持续观察程序的各项指标。
参数说明:S0 表示 Survivor0 区占用百分比,S1 表示 Survivor1 区占用百分比,E 表示 Eden 区占用百分比,O 表示老年代占用百分比,M 表示元数据区占用百分比,YGC 表示年轻代回收次数,YGCT 表示年轻代回收耗时,FGC 表示老年代回收次数,FGCT 表示老年代回收耗时。

D:\software\Java\jdk1.8.0_151\bin>jstat -gcutil 21984 5000 100
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  68.86  34.52  96.53  89.47   4968   87.791   674   17.954  105.745
  0.00  82.22  51.10  50.63  96.53  89.47   4978   87.964   675   18.001  105.965
  0.00  84.11  84.52  53.59  96.53  89.47   4984   88.080   676   18.031  106.110
  0.00  74.37   0.00  54.93  96.53  89.47   4992   88.211   677   18.059  106.270
 67.33   0.00  68.56  59.70  96.53  89.47   5001   88.380   678   18.088  106.468
  0.00  82.24  50.94  52.23  96.53  89.47   5008   88.517   679   18.130  106.647
  0.00  67.36  68.49  72.10  96.53  89.47   5018   88.681   680   18.164  106.845
  0.00  84.11   0.00  48.74  96.53  89.47   5022   88.739   681   18.197  106.936
  0.00  88.10  42.98  69.81  96.53  89.47   5032   88.908   682   18.226  107.134
 84.16   0.00  52.01  37.07  96.53  89.47   5035   88.968   683   18.257  107.225
 99.02   0.00  20.74  61.60  96.53  89.47   5045   89.150   684   18.286  107.437
 67.33   0.00  68.32  43.56  96.53  89.47   5051   89.262   685   18.317  107.579

2.7 jstack

通过命令行工具 jstack,也可以实现抓取线程栈的操作。抓取后可以使用类似fastthread(https://fastthread.io/)这样的在线分析工具来分析线程栈。

D:\software\Java\jdk1.8.0_151\bin>jstack 21984
2022-03-22 14:41:27
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.151-b12 mixed mode):

"RMI TCP Connection(14)-10.11.18.236" #55 daemon prio=5 os_prio=0 tid=0x000000006960e000 nid=0x450c runnable [0x000000027fffd000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
        - locked <0x00000000c05caec8> (a java.io.BufferedInputStream)
        at java.io.FilterInputStream.read(FilterInputStream.java:83)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:550)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$63/825324542.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

"JMX server connection timeout 28" #28 daemon prio=5 os_prio=0 tid=0x0000000068e70800 nid=0x698 in Object.wait() [0x000000020ffff000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(Redefined)
        - locked <0x00000000c0190630> (a [I)
        at java.lang.Thread.run(Thread.java:748)

"RMI Scheduler(0)" #27 daemon prio=5 os_prio=0 tid=0x0000000068e77000 nid=0x5a0c waiting on condition [0x00000001ffffe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000c0191a48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Redefined)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Redefined)
        at java.lang.Thread.run(Thread.java:748)
"VM Thread" os_prio=2 tid=0x0000000015e9a000 nid=0x2e94 runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000030ac000 nid=0x45a4 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000030b1800 nid=0x4b98 runnable
"VM Periodic Task Thread" os_prio=2 tid=0x000000006828f800 nid=0x4aac waiting on condition
JNI global references: 6909

2.8 jcmd

jcmd命令行工具用来查看Java HotSpot 虚拟机的 NMT 功能。查看前提需要开启NMT功能。设置VMOptions:-XX:NativeMemoryTracking=summary/detail 可以开启 NMT 功能,开启后可以使用 jcmd 工具查看 NMT 数据。开启NMT功能,重新启动。

查看线程堆栈信息
D:\software\Java\jdk1.8.0_151\bin>jcmd 16252 VM.native_memory summary
D:\software\Java\jdk1.8.0_151\bin>jcmd 16252 VM.native_memory detail

D:\software\Java\jdk1.8.0_151\bin>jcmd 16252 VM.native_memory summary
16252:

Native Memory Tracking:

Total: reserved=7161154KB, committed=5865482KB
-                 Java Heap (reserved=1048576KB, committed=1048576KB)
                            (mmap: reserved=1048576KB, committed=1048576KB)

-                     Class (reserved=1066262KB, committed=17430KB)
                            (classes #1297)
                            (malloc=9494KB #1211)
                            (mmap: reserved=1056768KB, committed=7936KB)

-                    Thread (reserved=4734092KB, committed=4734092KB)
                            (thread #34)
                            (stack: reserved=4733952KB, committed=4733952KB)
                            (malloc=100KB #186)
                            (arena=40KB #67)

-                      Code (reserved=250005KB, committed=3265KB)
                            (malloc=405KB #1002)
                            (mmap: reserved=249600KB, committed=2860KB)

-                        GC (reserved=48848KB, committed=48748KB)
                            (malloc=10384KB #137)
                            (mmap: reserved=38464KB, committed=38364KB)

-                  Compiler (reserved=187KB, committed=187KB)
                            (malloc=56KB #111)
                            (arena=131KB #3)

-                  Internal (reserved=10085KB, committed=10085KB)
                            (malloc=10021KB #8197)
                            (mmap: reserved=64KB, committed=64KB)

-                    Symbol (reserved=2581KB, committed=2581KB)
                            (malloc=1518KB #3730)
                            (arena=1063KB #1)

-    Native Memory Tracking (reserved=322KB, committed=322KB)
                            (malloc=74KB #1164)
                            (tracking overhead=248KB)

-               Arena Chunk (reserved=196KB, committed=196KB)
                            (malloc=196KB)


D:\software\Java\jdk1.8.0_151\bin>jcmd 16252 VM.native_memory detail
16252:

Native Memory Tracking:

Total: reserved=7161155KB, committed=5865551KB
-                 Java Heap (reserved=1048576KB, committed=1048576KB)
                            (mmap: reserved=1048576KB, committed=1048576KB)

-                     Class (reserved=1066262KB, committed=17430KB)
                            (classes #1297)
                            (malloc=9494KB #1211)
                            (mmap: reserved=1056768KB, committed=7936KB)

-                    Thread (reserved=4734092KB, committed=4734092KB)
                            (thread #34)
                            (stack: reserved=4733952KB, committed=4733952KB)
                            (malloc=100KB #186)
                            (arena=40KB #67)

-                      Code (reserved=250006KB, committed=3334KB)
                            (malloc=406KB #1008)
                            (mmap: reserved=249600KB, committed=2928KB)

-                        GC (reserved=48848KB, committed=48748KB)
                            (malloc=10384KB #137)
                            (mmap: reserved=38464KB, committed=38364KB)

-                  Compiler (reserved=187KB, committed=187KB)
                            (malloc=56KB #111)
                            (arena=131KB #3)

-                  Internal (reserved=10085KB, committed=10085KB)
                            (malloc=10021KB #8197)
                            (mmap: reserved=64KB, committed=64KB)

-                    Symbol (reserved=2581KB, committed=2581KB)
                            (malloc=1518KB #3730)
                            (arena=1063KB #1)

-    Native Memory Tracking (reserved=322KB, committed=322KB)
                            (malloc=74KB #1164)
                            (tracking overhead=248KB)

-               Arena Chunk (reserved=196KB, committed=196KB)
                            (malloc=196KB)

Virtual memory map:

[0x0000000000b30000 - 0x0000000000b40000] reserved and committed 64KB for Internal from
    [0x0000000072d480fe]
    [0x0000000072d6e045]
    [0x0000000072d6e154]
    [0x0000000072cf1755]

[0x0000000000b40000 - 0x0000000000b60000] reserved 128KB for GC from
    [0x0000000072cee317]
    [0x0000000072d195c2]
    [0x0000000072d19c3a]
    [0x0000000072ecd8b6]

[0x0000000011f50000 - 0x0000000012160000] reserved 2112KB for GC from
    [0x0000000072cee317]
    [0x0000000072d195c2]
    [0x0000000072d19c3a]
    [0x0000000072ba2b9c]

        [0x0000000012150000 - 0x0000000012151000] committed 4KB from
            [0x0000000072cee6e1]
            [0x0000000072ba2c12]
            [0x0000000072ec3a0c]
            [0x0000000072bc3106]

[0x0000000012160000 - 0x00000000122c0000] reserved 1408KB for GC from
    [0x0000000072cee317]
    [0x0000000072d195c2]
    [0x0000000072d19bf0]
    [0x0000000072ec2c61]

[0x00000000122c0000 - 0x00000000123c0000] reserved and committed 1024KB for Thread Stack from
    [0x0000000072d0f2a8]
    [0x0000000072ec28ef]
    [0x0000000072d6c3ea]
    [0x0000000073391d9f]
... ...
[0x0000000072d480fe]
[0x0000000072d6e045]
[0x0000000072d6e154]
[0x0000000072cf1755]
                             (reserved=64KB, committed=64KB)

2.9 jmap

jmap jvm自带命令行工具,可用于了解系统运行时的对象分布。
jmap pid 查看基本信息。
查看堆信息,jmap -heap pid。
jmap -histo pid 查看一些class的使用情况。
jmap -histo:live pid >dump.txt 输出class信息到dump文件。

D:\software\Java\jdk1.8.0_151\bin>jmap 16252
Attaching to process ID 16252, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
0x0000000072990000      36K     D:\software\Java\jdk1.8.0_151\jre\bin\dt_socket.dll
0x00000000729a0000      140K    D:\software\Java\jdk1.8.0_151\jre\bin\instrument.dll
0x00000000729d0000      32K     D:\software\Java\jdk1.8.0_151\jre\bin\npt.dll
0x00000000729e0000      212K    D:\software\Java\jdk1.8.0_151\jre\bin\jdwp.dll
0x0000000072a30000      68K     D:\software\Java\jdk1.8.0_151\jre\bin\nio.dll
0x0000000072a50000      104K    D:\software\Java\jdk1.8.0_151\jre\bin\net.dll
0x0000000072a70000      88K     D:\software\Java\jdk1.8.0_151\jre\bin\zip.dll
0x0000000072a90000      164K    D:\software\Java\jdk1.8.0_151\jre\bin\java.dll
0x0000000072ac0000      60K     D:\software\Java\jdk1.8.0_151\jre\bin\verify.dll
0x0000000072ad0000      8820K   D:\software\Java\jdk1.8.0_151\jre\bin\server\jvm.dll
0x0000000073370000      840K    D:\software\Java\jdk1.8.0_151\jre\bin\msvcr100.dll
0x00007ff7b0af0000      220K    D:\software\Java\jdk1.8.0_151\bin\java.exe
0x00007ffc80290000      156K    C:\WINDOWS\SYSTEM32\WINMM.dll
0x00007ffc84070000      2664K   C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.1110_none_60b5254171f9507e\COMCTL32.dll
0x00007ffc8e0c0000      92K     C:\WINDOWS\SYSTEM32\dhcpcsvc6.DLL
0x00007ffc8f2e0000      40K     C:\WINDOWS\SYSTEM32\VERSION.dll
0x00007ffc8f310000      116K    C:\WINDOWS\SYSTEM32\dhcpcsvc.DLL
0x00007ffc91290000      36K     C:\WINDOWS\SYSTEM32\WSOCK32.dll
0x00007ffc95780000      1936K   C:\WINDOWS\SYSTEM32\dbghelp.dll
0x00007ffc95a60000      7760K   C:\WINDOWS\SYSTEM32\windows.storage.dll
0x00007ffc96a40000      208K    C:\WINDOWS\system32\rsaenh.dll
0x00007ffc96dd0000      236K    C:\WINDOWS\SYSTEM32\IPHLPAPI.DLL
0x00007ffc96e20000      808K    C:\WINDOWS\SYSTEM32\DNSAPI.dll
0x00007ffc97130000      424K    C:\WINDOWS\system32\mswsock.dll
0x00007ffc97320000      48K     C:\WINDOWS\SYSTEM32\CRYPTBASE.dll
0x00007ffc97330000      96K     C:\WINDOWS\SYSTEM32\CRYPTSP.dll
0x00007ffc973d0000      176K    C:\WINDOWS\SYSTEM32\Wldp.dll
0x00007ffc97830000      184K    C:\WINDOWS\SYSTEM32\USERENV.dll
0x00007ffc978b0000      124K    C:\WINDOWS\SYSTEM32\profapi.dll
0x00007ffc97970000      136K    C:\WINDOWS\System32\win32u.dll
0x00007ffc97a10000      628K    C:\WINDOWS\System32\msvcp_win.dll
0x00007ffc97cc0000      520K    C:\WINDOWS\System32\bcryptprimitives.dll
0x00007ffc97d50000      156K    C:\WINDOWS\System32\bcrypt.dll
0x00007ffc97d80000      1024K   C:\WINDOWS\System32\ucrtbase.dll
0x00007ffc97ed0000      2848K   C:\WINDOWS\System32\KERNELBASE.dll
0x00007ffc981a0000      1068K   C:\WINDOWS\System32\gdi32full.dll
0x00007ffc982b0000      32K     C:\WINDOWS\System32\NSI.dll
0x00007ffc98340000      340K    C:\WINDOWS\System32\shlwapi.dll
0x00007ffc983a0000      7440K   C:\WINDOWS\System32\SHELL32.dll
0x00007ffc98af0000      632K    C:\WINDOWS\System32\msvcrt.dll
0x00007ffc98c60000      1172K   C:\WINDOWS\System32\RPCRT4.dll
0x00007ffc99080000      760K    C:\WINDOWS\System32\KERNEL32.DLL
0x00007ffc99140000      692K    C:\WINDOWS\System32\SHCORE.dll
0x00007ffc99320000      3408K   C:\WINDOWS\System32\combase.dll
0x00007ffc99680000      172K    C:\WINDOWS\System32\GDI32.dll
0x00007ffc997f0000      624K    C:\WINDOWS\System32\sechost.dll
0x00007ffc99920000      428K    C:\WINDOWS\System32\WS2_32.dll
0x00007ffc99990000      1664K   C:\WINDOWS\System32\USER32.dll
0x00007ffc99b30000      192K    C:\WINDOWS\System32\IMM32.DLL
0x00007ffc99b60000      32K     C:\WINDOWS\System32\PSAPI.DLL
0x00007ffc99b70000      696K    C:\WINDOWS\System32\ADVAPI32.dll
0x00007ffc9a250000      2004K   C:\WINDOWS\SYSTEM32\ntdll.dll
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Development Kit (JDK)是Java开发工具包,而JVM参数是为Java虚拟机(JVM)配置的一组参数。JDK8是Java 8版本的JDK,下面我将详细解释JDK8中常用的JVM参数配置。 1. -Xms和-Xmx:这是设置JVM初始化堆内存和最大堆内存的参数。-Xms设定初始堆大小,-Xmx设定最大堆大小。例如,-Xms512m表示初始堆大小为512MB,-Xmx1024m表示最大堆大小为1GB。 2. -Xss:这是设置线程栈大小的参数。默认值根据操作系统和JVM版本而定。可以根据应用程序的需求进行调整。例如,-Xss256k表示线程栈的大小为256KB。 3. -XX:MetaspaceSize和-XX:MaxMetaspaceSize:这是设置元空间(Metaspace)初始大小和最大大小的参数。元空间是Java 8引入的一种取代永久代(PermGen)的存储区域。例如,-XX:MetaspaceSize=128m表示元空间的初始大小为128MB,-XX:MaxMetaspaceSize=256m表示元空间的最大大小为256MB。 4. -XX:NewSize、-XX:MaxNewSize和-XX:SurvivorRatio:这些是控制新生代(Young Generation)内存大小以及Eden区、Survivor区的比例的参数。新生代是堆内存的一部分,存放新创建的对象。可以通过调整这些参数来优化垃圾回收性能。 5. -XX:+UseParallelGC和-XX:+UseConcMarkSweepGC:这些是选择垃圾回收器的参数。Parallel GC(并行垃圾回收器)和CMS(并发标记清除垃圾回收器)是JDK8默认的两种垃圾回收器。分别用于在不同场景下提供更好的垃圾回收性能。 这些只是JDK8中常用的JVM参数配置的一部分。根据实际需求,还有其他许多参数可以进行调整以达到最佳性能和稳定性。重要的是要了解这些参数,并根据应用程序的需求进行适当的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值