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

目录
相关文章
|
18天前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
2月前
|
存储 缓存 监控
【JVM调优】如何进行JVM调优?一篇文章就够了!
深入解读JVM性能的监控、定位和调优方案,阐述jps/stat/jstack、MAT等常用性能分析工具的使用,提出JVM参数、内存溢出、内存泄漏、CPU飙升、GC频繁等实际场景下JVM调优的方案。
268 15
【JVM调优】如何进行JVM调优?一篇文章就够了!
|
3月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
282 0
|
3月前
|
运维 监控 Java
【JVM 调优秘籍】实战指南:JVM 调优参数全解析,让 Java 应用程序性能飙升!
【8月更文挑战第24天】本文通过一个大型在线零售平台的例子,深入探讨了Java虚拟机(JVM)性能调优的关键技术。面对应用响应延迟的问题,文章详细介绍了几种常用的JVM参数调整策略,包括堆内存大小、年轻代配置、垃圾回收器的选择及日志记录等。通过具体实践(如设置`-Xms`, `-Xmx`, `-XX:NewRatio`, `-XX:+UseParallelGC`等),成功降低了高峰期的响应时间,提高了系统的整体性能与稳定性。案例展示了合理配置JVM参数的重要性及其对解决实际问题的有效性。
94 0
|
4月前
|
监控 Java
JVM内存问题之使用jstat命令查看GC堆百分比占比情况,应该使用哪个选项
JVM内存问题之使用jstat命令查看GC堆百分比占比情况,应该使用哪个选项
|
4月前
|
Java
JVM内存问题之jstack命令查看JVM线程快照如何解决
JVM内存问题之jstack命令查看JVM线程快照如何解决
|
4月前
|
开发者 Java
JVM内存问题之top命令的物理内存信息中,'used'和'free','avail Mem'分别表示什么
JVM内存问题之top命令的物理内存信息中,'used'和'free','avail Mem'分别表示什么
|
4月前
|
监控 Java 运维
开发与运维收集问题之jstat命令查看JVM垃圾回收情况如何解决
开发与运维收集问题之jstat命令查看JVM垃圾回收情况如何解决
44 1
|
4月前
|
监控 算法 Java
深入理解Java虚拟机:JVM调优的实用策略
在Java应用开发中,性能优化常常成为提升系统响应速度和处理能力的关键。本文将探讨Java虚拟机(JVM)调优的核心概念,包括垃圾回收、内存管理和编译器优化等方面,并提供一系列经过验证的调优技巧。通过这些实践指导,开发人员可以有效减少延迟,提高吞吐量,确保应用稳定运行。 【7月更文挑战第16天】
68 4
|
3月前
|
监控 算法 Java
深入理解Java虚拟机:JVM调优与性能提升
本文旨在为Java开发者提供一条清晰的路径,以深入掌握Java虚拟机(JVM)的内部机制和性能调优技巧。通过具体案例分析,我们将探讨如何识别性能瓶颈、选择合适的工具进行监控与调试,以及实施有效的优化策略,最终达到提高应用程序性能的目的。文章不仅关注理论,更注重实践应用,帮助读者在面对复杂的Java应用时能够游刃有余。
72 0