JVM性能调优-JVM工具使用

命令行工具

jps

jps -q 只看进程id

jps -l  显示java进程的完整类名

jps -m 查看传递给主类main()的参数

jps -v 列出虚拟机启动时的jvm参数

以上参数可以组合使用

jstat

查看JVM统计信息

 

例:jstat -gc -t 19788 1000 10

-gc:打印gc统计信息 ;-t:打印程序已经运行了多长时间(秒);19788:进程id;1000:每隔多少秒打印一次(毫秒);10:一共打印10次

经验:

  • 可以比较两次测量的间隔时间以及总GC时间的增量,得出GC时间占运行总时间的比例。日过比例超过20%,说明目前堆的压力比较大;如果比例超过90%,说明堆里几乎没有可用空间,随时都可能抛出OOM
  • 得到连续多组OU值,取出每组的最小值,如果这些值呈上升趋势,说明老年代内存已使用量在不断上涨,意味着无法回收的对象在不断增加,很可能存在内存泄

 jinfo

Configuration Info for Java。查看虚拟机配置参数信息,也可用于调整虚拟机的参数配置。

查看:

jinfo -sysprops PID:查看由System.getProperties()取得的参数

jinfo -flags PID:查看全部虚拟机参数

jinfo -flag [参数] PID:查看有没有指定参数

修改:

可以在运行时修改部分参数,并立即生效。但是不是所有的参数都支持动态修改,只有被标记为manageable的flag才可以被实时修改

 

jmap

jmap(JVM Memory Map)。获取dump文件(堆转储快照文件,二进制文件);获取目标Java进程的内存相关信息。

使用一导出内存映像文件

手动:jmap -dump:format=b,file=d:\1.hprof PID

jmap -dump:live,format=b,file=d:\1.hprof PID (只dump存活的对象)

自动(当OOM时自己dump):配置两个JVM参数,-XX:+HeapDumpOnOutOfMemoryError 

-XX:HeapDumpPath=D:\filename.hprof

使用二显示堆内存相关信息

jmap -heap PID > a.txt

jmap -histo PID > b.txt

(新版JDK使用有变化)

jhat

jhat(JVM Analysis Tool)分析jmap生成的heap dump文件。jhat内置了一个微型的HTTP/HTML服务器,可以在浏览器查看分析结果

(jhat在JDK9、JDK10中已经被删除,官方建议用VisualVM代替)

基本使用语法:jhat [option][dumpfile]

默认使用7000端口

jstack

jstack(JVM Stack Trace):生成指定进程当前时刻的线程快照(虚拟机堆栈跟踪)即每一条线程正在执行的方法堆栈的集合。

可用于定位长时间停顿的原因,如线程间死锁

官方帮助文档:jstack

模拟死锁代码:

package other.并发;

/**
 * @author: 小手WA凉
 * @create: 2024-10-09
 */
public class ThreadDeadLock {
    final static Object lock1 = new Object();
    final static Object lock2 = new Object();
    public static void deadLock() {
        new Thread(() -> {
            synchronized (lock1) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (lock2) {

                }
            }
        }).start();
        new Thread(() -> {
            synchronized (lock2) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (lock1) {

                }
            }
        }).start();
    }

    public static void main(String[] args) {
        ThreadDeadLock.deadLock();
    }
}

jstack PID分析:

 GUI

JDK自带

jconsole

从Java5开始JDK自带的java监控工具,用于对JVM中内存、线程和类的监控

Visual VM

功能更强大的故障诊断和性能监控的可视化工具

也可独立安装(JDK9之后不自带了):VisualVM: Home

visual vm功能强大之一就是可以自己安装插件,比如Visual GC

主要功能:

生成/读取堆dump内存快照

查看JVM参数和系统属性

查看运行中的虚拟机进程

生成/读取线程快照

程序资源的实时监控

第三方工具

Arthas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值