JVM(六)JVM调优命令

简介: JVM(六)JVM调优命令

事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用

  • jps:查看java进程
PS C:\Users\liaozijian> jps
54888 jar
50772 Jps
  • jmap: 查看内存信息,实例个数以及占用内存大小powershell
#jmap -histo 54888 查看历史生成的实例
#jmap -histo:live 54888 查看当前存活的实例,执行过程中可能会触发一次full gc
PS C:\Users\liaozijian> jmap -histo 54888 > d:/log.txt
  • log.txt部分内容如下properties
 num     #instances         #bytes  class name
----------------------------------------------
   1:          8971       23808216  [I
   2:        104987       14049304  [C
   3:         11164        7893848  [B
   4:         89315        2143560  java.lang.String
   5:         23896        2102848  java.lang.reflect.Method
   6:         43886        1404352  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
   7:         12000        1325584  java.lang.Class
   8:         39461        1262752  java.util.concurrent.ConcurrentHashMap$Node
   9:         27082        1083280  java.util.LinkedHashMap$Entry
  10:         11795         894544  [Ljava.util.HashMap$Node;
  11:         15800         863136  [Ljava.lang.Object;
  12:         13029         729624  java.util.LinkedHashMap
  ..................
  • num:序号
  • instances:实例数量
  • bytes:占用空间大小
  • class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[]
  • 查看堆信息
PS C:\Users\liaozijian> jmap -heap 54888
Attaching to process ID 54888, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4292870144 (4094.0MB)
   NewSize                  = 89128960 (85.0MB)
   MaxNewSize               = 1430781952 (1364.5MB)
   OldSize                  = 179306496 (171.0MB)
   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 = 321912832 (307.0MB)
   used     = 59181336 (56.439720153808594MB)
   free     = 262731496 (250.5602798461914MB)
   18.384273665735698% used
From Space:
   capacity = 17825792 (17.0MB)
   used     = 17534448 (16.722152709960938MB)
   free     = 291344 (0.2778472900390625MB)
   98.36560417624081% used
To Space:
   capacity = 19922944 (19.0MB)
   used     = 0 (0.0MB)
   free     = 19922944 (19.0MB)
   0.0% used
PS Old Generation
   capacity = 132644864 (126.5MB)
   used     = 18898856 (18.023353576660156MB)
   free     = 113746008 (108.47664642333984MB)
   14.247710337280756% used
27696 interned Strings occupying 2852544 bytes.
  • 堆内存 dump
jmap -dump:format=b,file=eureka.hprof 54888
  • 也可以设置内存溢出自动导出dump文件
    示例代码
/**
 * 测试OOM
 * -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dump
 * @author Zijian Liao
 * @since 1.0
 */
public class OOMTest {
    static List<Object> list = new ArrayList<>();
    public static void main(String[] args) {
        while (true) {
            list.add(new User());
        }
    }
    static class User {
        byte[] bytes = new byte[1024];
    }
}
  • 可以用jvisualvm命令工具导入该dump文件分析
  • jstack:查看线程情况:如死锁,某个线程导致cpu飙高
    示例代码
public class DeadLockTest {
   private static Object lock1 = new Object();
   private static Object lock2 = new Object();
   public static void main(String[] args) {
      new Thread(() -> {
         synchronized (lock1) {
            try {
               System.out.println("thread1 begin");
               Thread.sleep(5000);
            } catch (InterruptedException e) {
            }
            synchronized (lock2) {
               System.out.println("thread1 end");
            }
         }
      }).start();
      new Thread(() -> {
         synchronized (lock2) {
            try {
               System.out.println("thread2 begin");
               Thread.sleep(5000);
            } catch (InterruptedException e) {
            }
            synchronized (lock1) {
               System.out.println("thread2 end");
            }
         }
      }).start();
      System.out.println("main thread end");
   }
}
  • powershell
PS C:\Users\liaozijian> jstack 53460
Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x000000001c451288 (object 0x000000076b02c848, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000001c44d1e8 (object 0x000000076b02c858, a java.lang.Object),
  which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.my.jvm.test.gc.DeadLockTest.lambda$main$1(DeadLockTest.java:30)
        - waiting to lock <0x000000076b02c848> (a java.lang.Object)
        - locked <0x000000076b02c858> (a java.lang.Object)
        at com.my.jvm.test.gc.DeadLockTest$$Lambda$2/1688376486.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at com.my.jvm.test.gc.DeadLockTest.lambda$main$0(DeadLockTest.java:17)
        - waiting to lock <0x000000076b02c858> (a java.lang.Object)
        - locked <0x000000076b02c848> (a java.lang.Object)
        at com.my.jvm.test.gc.DeadLockTest$$Lambda$1/38997010.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
  • jinfo -flags pid:查看jvm参数
  • jinfo -sysprops pid:查看系统参数
  • jstat -gc pid [time] [count]:评估程序内存使用及GC压力整体情况
  • S0C:第一个幸存区的大小,单位KB
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小(元空间)
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间,单位s
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间,单位s
  • GCT:垃圾回收消耗总时间,单位s

目录
相关文章
|
1月前
|
监控 架构师 Java
JVM 11 调优指南:如何进行JVM调优,JVM调优参数
JVM 11的优化指南:如何进行JVM调优,以及JVM调优参数有哪些”这篇文章将包含JVM 11调优的核心概念、重要性、调优参数,并提供12个实用的代码示例,每个示例都会结合JVM调优参数和Java代码
152 2
|
1月前
|
存储 缓存 监控
JVM 21 的调优指南:如何进行JVM调优,JVM调优参数
聊聊关于JVM 21的优化指南。这篇文章将会深入探讨如何进行JVM调优,介绍一些关键的JVM调优参数,并提供12个实用的代码示例。由于篇幅较长,我会分几个部分来详细讲解,之前写的也有33篇系列教程JVM调优实战打击也可以去围观。
176 0
|
1月前
|
监控 架构师 Java
JVM 8 调优指南:如何进行JVM调优,JVM调优参数
这篇文章将详细介绍如何进行JVM 8调优,包括JVM 8调优参数及其应用。此外,我将提供12个实用的代码示例,每个示例都会结合JVM启动参数和Java代码。JVM调优是指通过调整Java虚拟机的配置来提升Java应用程序的性能。这包括优化堆内存设置、选择合适的垃圾收集器以及调整其他性能相关的参数。
311 0
|
1月前
|
监控 安全 架构师
JVM 17 调优指南:如何进行JVM调优,JVM调优参数
在这篇文章中,我会详细介绍JVM调优的概念、重要性和具体的JVM调优参数。此外,我将提供12个实用的代码示例,每个示例都会包含JVM调优参数和相应的Java代码。JVM调优是调整和配置Java虚拟机(JVM)的过程,以便最大限度地提高应用程序的性能和效率。这涉及到调整内存设置、选择合适的垃圾收集器,以及配置各种性能参数。
381 0
|
1月前
|
监控 Java
【JVM】深入理解JVM调优
【JVM】深入理解JVM调优
15 0
|
9月前
|
监控 Java 编译器
JVM运行命令
JVM运行命令
66 0
|
1月前
|
Java Unix Linux
【JVM】JVM 调优参数
【1月更文挑战第27天】【JVM】JVM 调优参数
|
7月前
|
jenkins Java Shell
Jenkins 打包shell出现gradle命令不存在,jvm内存溢出
Jenkins 打包shell出现gradle命令不存在,jvm内存溢出
68 4
|
Arthas 监控 数据可视化
jvm性能调优实战 - 61常用的JVM调优网站
jvm性能调优实战 - 61常用的JVM调优网站
296 0
|
7月前
|
算法 Java 编译器
JVM常用命令整理
JVM常用命令整理
94 0