掌握 JVM 调优命令

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

JVM 日常调优总结起来就是:首先通过 jps 命令查看当前进程,然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数,通过 jstat 命令查看 class 的加载信息以及 GC 信息,通过 jstack 命令查看线程堆栈信息,通过 jmap 命令查看堆内存信息。

1

jps:查看当前 java 进程

6a410ff93509d1513ae0b73d536f6610.png

jps 是 Java 虚拟机自带的命令行工具,用于显示当前运行的所有Java进程及其相关信息,包括进程 ID、主类、进程状态等。其基本用法为:

jps [options]

其中,常用的选项有:

-l:显示主类的完整路径名。

-p:显示进程的当前线程所在的工作进程组。

-s:显示进程的启动时间。

-v:显示进程的虚拟机信息,如JVM版本、GC类型等。

要查看当前所有正在运行的Java进程及其相关信息,可以输入命令:jps

要查看主类的完整路径名,可以输入命令:jps -l

要查看进程的启动命令行参数字符串,可以输入命令:jps -m

需要注意的是,由于 jps 命令直接读取 Java 虚拟机的内部数据,因此需要确保当前用户具有足够的权限才能使用。

2

jinfo:实时查看和调整 JVM 配置参数

9a6b4f6ff0dbea1353b9c0c2ce650742.png

jinfo 是 Java 虚拟机自带的命令行工具,用于查看和调整Java虚拟机的配置参数和运行状态。它可以用来检查Java虚拟机的内存使用情况、垃圾回收情况、类加载情况等。要使用 jinfo 命令,您可以在 Java 程序运行的终端或命令行界面中输入以下命令:

jinfo <pid> [options]

其中,"pid"是Java进程的进程ID,可以通过"jps"命令查看

例如,要查看Java虚拟机的内存使用情况,可以使用以下命令:

jinfo <pid> -dump:live

这将输出Java虚拟机的运行状态信息,包括内存使用情况、线程信息等。

要查看Java虚拟机的堆区信息,可以使用以下命令:

jinfo <pid> -printHeapRegions

这将输出Java虚拟机的堆区信息,包括堆区的使用情况、空闲情况等。

jinfo 使用实例

使用 jps 查看当前 java 进程

D:\>jps
10232 Jps
20264 TestJvm
1668

使用 jinfo 实时查看 JVM 参数,使用方法:jinfo -flag <optionName><pid>

D:\>jinfo -flag MaxHeapSize 16684
-XX:MaxHeapSize=1073741824D:\>jinfo -flag MaxHeapSize 20264
-XX:MaxHeapSize=4261412864D:\>jinfo -flag UseG1GC 20264
-XX:-UseG1GCD:\>jinfo -flag UseConcMarkSweepGC 20264
-XX:-UseConcMarkSweepGCD:\>jinfo -flag UseParallelGC 20264
-XX:+UseParallelGC

使用 jinfo 可以在不重启虚拟机的情况下,动态的修改 jvm 的参数,只有被标记为 {manageable}的参数可以被实时修改,尤其在线上的环境特别有用。

Boolean 类型使用方法:

jinfo -flag [+|-]<optionName> <pid>

需要指定参数值的类型使用方法:

jinfo -flag <optionName>=value <pid>

1、查看进程 16116 是否开启 GC 打印,
输出 -XX:-PrintGC 表示没有开启D:\>jinfo -flag PrintGC 16116
-XX:-PrintGC2、使用 jinfo 命令修改进程 16116 
开启 GC 打印D:\>jinfo -flag +PrintGC 161163、 修改后再次查看进程 16116 是否开启 GC 打印,
输出 -XX:+PrintGC 表示开启D:\>jinfo -flag PrintGC 16116
-XX:+PrintGC

使用 jinfo 查看修改过值的参数,使用方法:jinfo -flags <pid>

efb3a531da42569368205eb59b866963.png

3

jstat:查看虚拟机统计信息

8813ea6d9f2337f668ac711ed2665ae1.png

jstat 是 Java 虚拟机自带的命令行工具,用于查看 Java 虚拟机的运行状态和性能统计信息。它可以用来监测 Java 虚拟机的内存使用情况、垃圾回收情况、类加载情况等。ID,可以通过"jps"命令来获取。"interval"是两次统计之间的时间间隔(单位为毫秒),"count"是要统计的次数。

官网链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE

jstat 使用方法:jstat <option> <pid> <间隔时间> <统计次数>

例如,要查看类加载信息,可以使用以下命令:

jstat -class <pid>

这将输出Java虚拟机的类加载信息,包括已加载的类数、已卸载的类数、当前正在加载的类等。

使用 jstat 查看类加载器的统计信息,默认的间隔时间是毫秒,如下:

7d6a774958ae01eed299d7d9c421792f.png

例如,要查看Java虚拟机的内存使用情况,可以使用以下命令:

jstat -gcutil <pid>

这将输出Java虚拟机的垃圾回收器的统计信息,包括堆区的使用情况、空闲情况等。

使用 jstat 查看垃圾收集统计信息的摘要,如下:

19794d3b5d6af1b0322a5456d6ac9a98.png

4

jstack:查看线程堆栈信息

11ff5fd53b06ef7f2c1346bc1f3908c2.png

官网链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html#BABGJDIF

使用 jstack 方便排查线程问题,使用方法:jstack <pid>

1、下面看一个经典的死锁问题:

package jvm;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class LockDemo {// 定义锁对象static Lock LOCK1 = new ReentrantLock();static Lock LOCK2 = new ReentrantLock();public static void main(String[] args) throws Exception {new Thread(new DeadLock(true), "线程1").start();Thread.sleep(1);new Thread(new DeadLock(false), "线程2").start();}
}//模拟死锁
class DeadLock implements Runnable {private boolean flag;public void run() {if (flag) {while (true) {synchronized (LockDemo.LOCK1) {System.out.println(Thread.currentThread().getName() + "获得LOCK1锁");synchronized (LockDemo.LOCK2) {System.out.println(Thread.currentThread().getName() + "获得LOCK2锁");}}}} else {while (true) {synchronized (LockDemo.LOCK2) {System.out.println(Thread.currentThread().getName() + "获得LOCK2锁---");synchronized (LockDemo.LOCK1) {System.out.println(Thread.currentThread().getName() + "获得LOCK1锁---");}}}}}DeadLock(boolean flag) {this.flag = flag;}
}

d4975411029527723bef833e216d9404.png

我们通过 jstack 命令查看一下线程的堆栈信息:

D:\>jps
5288 Jps
7896 LockDemo
16684D:\>jstack 7896

在堆栈信息的最后可以发现死锁的产生,如下:

1a7a976a9f54a1c1e4045fa297a84e0c.png

2、利用 jstack 定位某个进程中 CPU 占用高的线程问题

步骤一:使用 top 命令查看 CPU 占用高的进程,假设找到 %CPU 占比高的进程 PID 为 17896。(小技巧:top 显示界面,输入大写 P,结果按 CPU 占用降序排序;输入大写 M,结果按内存占用降序排序。【大写 P 可以在 caps lock 状态输入 p,或者按 Shift+p】)

步骤二:使用 top -H -p <pid> 命令查看某个进程内部 CPU 占用高的线程 ,top -H -p 17896,假设找到 %CPU 占比高的线程 PID 为 17935

步骤三:使用 printf "%x\n" <pid> 命令转换线程 PID 为16进制,printf "%x\n" 17935 ,16进制结果为 460F

步骤四:使用 jstack <pid> 命令查看 CPU 占用高的线程信息,jstack 17896 | grep 460F -A 50

5

jmap:查看堆内存的快照信息

b39506f786d5827febbb433d2482b3d4.png

使用 jmap -heap <pid> 查看堆内存信息,启动程序时配置 JVM 参数,-Xms30M -Xmx30M

03bff412d97d86874ef25a264f3e81ab.png

1、dump 出堆内存信息

手动 dump 使用方法:-dump:format=b,file=filename <pid>

注意:-dump:format=b,是固定格式,如果设置 dump 文件到某个文件夹下,则该文件夹必须存在

D:\>jmap -dump:format=b,file=d:/dump/heap.hprof 11092
Dumping heap to D:\dump\heap.hprof ...
Heap dump file created

生成的 heap.hprof 文件可以结合工具来分析,后面介绍。

自动 dump 使用方法:启动程序时配置以下的 JVM 参数,当内存溢出时会自动在指定的目录生成 dump 文件,这个一般在生产环境很有用。

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/dump/heap.hprof

2、演示 OOM 时,自动 dump

package jvm;import java.util.ArrayList;
import java.util.List;//测试代码
public class TestHeap {public static void main(String[] args) {List<Heap> list = new ArrayList<Heap>();while (true) {list.add(new Heap());}}
}class Heap {String HeapName = "Java Heap 测试";
}

926a8573e19b6c6cf2d19ca137e72079.png

由于生成内存快照文件会占用大量的磁盘空间,因此在使用时需要注意磁盘空间的的使用情况。

后面将为大家介绍常用 JVM 调优工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/62326.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 语言并发编程 及 进阶与依赖管理

1.0 从并发编程本质了解Go高性能的本质 1.1 Goroutine 协程可以理解为轻量级线程&#xff1b; Go更适合高并发场景原因之一&#xff1a;Go语言一次可以创建上万协成&#xff1b; “快速”&#xff1a;开多个协成 打印。 go func(): 在函数前加 go 代表 创建协程; time.Sleep():…

软件开发人员这样跟踪时间,简单又有效!

作为软件开发人员&#xff0c;会有大量的代码需要编写&#xff0c;有大量的错误需要解决&#xff0c;有大量的功能需要构建。问题是&#xff0c;错误计算的任务堆积如山&#xff0c;很难正确掌握时间。 令人震惊的现实是&#xff0c;近一半的开发人员每周花在软件项目上的时间…

免费实用的日记应用:Day One for Mac中文版

Day One for Mac是一款运行在Mac平台上的日记软件&#xff0c;你可以使用Day One for mac通过快速菜单栏条目、提醒系统和鼓舞人心的信息来编写更多内容&#xff0c;day one mac版还支持Dropbox同步功能&#xff0c;想要day one mac中文免费版的朋友赶紧来试试吧&#xff01; …

AI模型公司如何定位 ?

AI模型公司如何定位 ? 企业与消费者&#xff1f; 和 多用途与利基市场&#xff1f; 文本将分解每个象限。 消费类和多用途 最有价值的象限并引发了人工智能热潮。 顶级公司&#xff1a; Open AI - 通过 ChatGPT 为消费者构建&#xff0c;并通过其旗舰 GPT 模型为企…

小鱼深度产品测评之:阿里云容器服务器ASK,一款不需购买节点,即可直接部署容器应用。

容器服务器ASK测评 1、引言2、帮助文档3、集群3.1集群列表3.1.1 详情3.1.1.1概览 tab3.1.1.2基本信息 tab3.1.1.4集群资源 tab3.1.1.5 集群日志 tab3.1.1.6 集群任务 tab 3.1.2 应用管理3.1.2.1 详情3.1.2.2 详情3.1.2.3 伸缩3.1.2.4 监控 3.1.3 查看日志3.1.3.1 集群日志3.1.3…

Vue组件化开发思想;Vue的全局组件;Vue的局部组件;Vue的开发模式和解析;Vue CLI安装和使用;Vue项目的创建方式–Vite

目录 1_Vue组件化开发思想1.1_认识组件化开发1.2_Vue的组件化1.3_注册组件的方式 2_Vue的全局组件3_Vue的局部组件4_Vue的开发模式和解析4.1_Vue的开发模式4.2_单文件的特点4.3_如何支持SFC4.4_VSCode对SFC文件的支持 5_Vue CLI安装和使用5.1_Vue CLI脚手架5.2_Vue CLI 安装和使…

基于SLAM的规划算法仿真复现|SLAM|智能规划

图片来自百度百科 前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.n…

给大家推荐9个Linux高效运维命令技巧!

文章目录 前言一、实用的 xargs 命令二、命令或脚本后台运行三、找出当前系统内存使用量较高的进程四、找出当前系统CPU使用量较高的进程五、同时查看多个日志或数据文件六、持续ping并将结果记录到日志七、查看tcp连接状态八、查找80端口请求数最高的前20个IP九、ssh实现端口转…

STM32F429IGT6使用CubeMX配置GPIO点亮LED灯

1、硬件电路 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、生成工程配置 5、部分代码 6、实验现象

【LeetCode每日一题】——575.分糖果

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 575.分糖果 四【题目描述】 Alice 有 n 枚糖&…

WLRYJ-300型微流控芯片真空热压机

WLRYJ-300型微流控芯片真空热压机 关键词&#xff1a;微流控芯片&#xff0c;热压封合&#xff0c;LNP合成芯片 WLRYJ-300型微流控芯片真空热压机是一款应用于PMMA、PC、PP、COP、COC、BOPET、CBC、树脂&#xff08;部分&#xff09;、聚乙烯&#xff08;部分&#xff09;等硬质…

el-table那些事

el-table那些事 1、获取el-table所有勾选的行数据2、el-table自定义列标题3、el-table列可编辑&#xff0c;加入el-input等 用于记录工作和日常学习遇到的坑&#xff0c;需求。 vue3element-plusts 1、获取el-table所有勾选的行数据 1、需要先声明一个ref变量&#xff0c;并赋…