JVM-常用调优命令

本文详细介绍了JVM的几个关键监控和分析命令,包括jps、jstat、jmap和jstack的使用方法及其参数含义。通过这些工具,可以查看Java进程信息、内存状态、垃圾收集情况以及线程堆栈,帮助进行性能调优和问题排查。例如,使用jstat可以监控GC状态,jmap可以生成堆转储快照,jstack则用于生成线程快照,辅助分析死锁等问题。

1、java -XX:+PrintFlagsInitial -version > PrintFlagsInitial.txt    --- 查看jvm所有默认参数值

2、jps:查看当前java进程
        -l : 输出主类或jar的完全路径名
        -v : 输出jvm参数
        -m : 输出jvm启动时传递给main()的参数
    
3、jstat :  用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
            jstat命令格式 :jstat [Options] vmid [interval] [count] 
                Options, 一般使用 -gcutil 或 -gc 用于查看gc情况
                vmid是Java虚拟机ID,即当前运行的java进程号,在Linux/Unix系统上一般就是进程ID == pid
                interval, 间隔时间(单位为秒或毫秒)
                count,打印次数,如果省略则打印无数次
        Options 参数如下:
            -gc:统计 jdk gc时 heap信息,以使用空间字节数表示
            -gcutil:统计 gc时, heap情况,以使用空间的百分比表示
            -class:统计 class loader行为信息
            -compile:统计编译行为信息
            -gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况
            -gccause:统计引起 gc的事件
            -gcnew:统计 gc时,新生代的情况
            -gcnewcapacity:统计 gc时,新生代 heap容量
            -gcold:统计 gc时,老年代的情况
            -gcoldcapacity:统计 gc时,老年代 heap容量
            -gcpermcapacity:统计 gc时, permanent区 heap容量

列举:
            jstat -gc 1712 5000 5
            每 5000毫秒一次 显示进程号为 1712 的java进程的GC情况,一共生成5次 

S0C : survivorFrom 区的大小
S1C : survivorTO 区的大小
S0U : survivorFrom 区的使用大小
S1U : survivorTO 区的使用大小    
EC:eden区的大小
EU:eden区的使用大小
OC:老年代的大小
OU:老年代的使用大小    
MC:(Metaspace)元空间的大小,元空间实现了方法区
MU:元空间的使用大小    
CCSC:压缩类空间大小CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间    
FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间     
CCS(compressed class space):压缩类空间,在64位平台上,HotSpot使用了两个压缩优化技术,Compressed Object Pointers (“CompressedOops”) 和 Compressed Class Pointers。压缩指针,指的是在 64 位的机器上,使用 32 位的指针来访问数据(堆中的对象或 Metaspace 中的元数据)的一种方式。32位的指针占用内存更小,有利于更好使用缓存。当然,在 64 位的机器中,最终还是需要一个 64 位的地址来访问数据的,所以这个 32 位的值是相对于一个基准地址的值。

4、jmap(Java Virtual Machine Memory Map): jdk提供的一个生成java虚拟机的堆转储快照dump文件的命令行工具。
        [option]
                -dump:live,format=b,file=dump.hprof 1712  --- 生成进程 【PID = 1712】的堆转储快照dump文件
                        live ---> 只转储活着的对象;没有指定则转储堆中的所有对象
                        format=b ---> 表示以hprof二进制格式转储java堆内存
                        file=<filename> ---> 用于指定快照dump文件的文件名
        使用MAT(Memory Anlysis Tool)分析dump文件(分析目标:程序是否内存泄露、程序大对象的占用是否合理、程序中部分对象产生的内存是否可以优化)
         mat下载:https://www.eclipse.org/mat/downloads.php

                -heap 1712  --- 打印heap的概要信息,GC使用的算法,heap的配置及wise heap 的使用情况。    

5、jstack : 用于生成java虚拟机当前时刻的线程快照,为虚拟机内每一条线程正在执行的方法堆栈的集合,用于定位线程出现长时间停顿的原因,诸如死锁、死循环等。
        jstack [option] PID
                [option]
                        -F : 当正常输出请求不被响应时,强制输出线程堆栈
                         -l : 除堆栈外,显示关于锁的附加信息
                       -m : 如果调用到本地方法的话,可以显示C/C++的堆栈
例:jstack -l 1712 | more >> jstack_1712.txt
线程周期状态:
        New: 创建线程对象的状态,此时线程仅仅是创建成功还未执行;
        Runnable:调用thread.start(),线程转变为Runnable。此刻进入线程抢占CPU阶段;
        Running:抢占CPU成功,线程开始执行;
        Waiting:调用了 thread.join() 或 锁对象调用了 obj.wait() 等就会进入Waiting状态,此刻线程需等待某个条件发生来唤醒自己;
        Timed_Waiting:调用了 Thread.sleep(long)、thread.join(long) 或 obj.wait(long) 等就会进入 Timed_Waiting 状态,与Waiting的区别在于Timed_Waiting的等待有时间限制;
        Blocked:如果进入同步方法或同步代码块,没有获取到锁,则会进入Blocked状态;
        Dead:线程执行完毕,或抛出了未捕获的异常之后,则会进入dead状态,表示该线程已结束。
                针对 jstack日志,注意点:
                        a、Deadlock ---> 死锁
                        b、Waiting on condition ---> 等待某个条件发生来唤醒,需分析是否处于sleep 或是 网络读写繁忙而等待。
                        c、in Object.wait() ---> 获取锁后又执行 obj.wait() 放弃锁

JVM工具命令详解》是一份预习资料,主要介绍了Java虚拟机(JVM过程中使用的一些工具命令。这些工具命令可以帮助开发人员诊断和JVM的性能问题。 文中首先介绍了常用JVM工具命令,包括jps、jstat、jinfo、jmap、jhat等。这些命令可以用于查看JVM进程信息、统计JVM内存和线程情况、获取JVM配置参数等。通过使用这些工具命令开发人员可以快速定位JVM性能瓶颈所在,进行化。 接下来,文中详细介绍了每个工具命令的使用方法和参数解释。例如,jstat命令可以用于查看JVM内存情况,包括堆内存使用量、垃圾回收情况等。而jmap命令可以用于生成堆内存转储文件,帮助开发人员分析内存泄漏问题。通过掌握这些工具命令的使用,开发人员可以更加高效地进行JVM。 此外,文中还介绍了一些实际的案例,通过使用这些工具命令来解决实际的JVM性能问题。这些案例包括内存泄漏、线程死锁、CPU占用过高等问题。通过学习这些案例,开发人员可以更好地理解如何利用工具命令来诊断和解决JVM性能问题。 总的来说,《JVM工具命令详解》是一份非常实用的预习资料,适合那些需要深入学习JVM性能化的开发人员。通过学习和掌握这些工具命令开发人员能够更加高效地进行JVM,提升应用程序的性能和稳定性。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值