掌握 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=1073741824


D:\>jinfo -flag MaxHeapSize 20264
-XX:MaxHeapSize=4261412864


D:\>jinfo -flag UseG1GC 20264
-XX:-UseG1GC


D:\>jinfo -flag UseConcMarkSweepGC 20264
-XX:-UseConcMarkSweepGC


D:\>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:-PrintGC


2、使用 jinfo 命令修改进程 16116 
开启 GC 打印


D:\>jinfo -flag +PrintGC 16116


3、 修改后再次查看进程 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
16684


D:\>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.mfbz.cn/a/62657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漫画 | TCP/IP之大明邮差

后记&#xff1a; 1973年&#xff0c;卡恩与瑟夫开发出了网络中最核心的两个协议&#xff1a;TCP协议和IP协议&#xff0c;随后为了验证两个协议的可用性&#xff0c;他们做了一个实验&#xff0c;在多个异构网络中进行数据传输&#xff0c;数据包在经过近10万公里的旅程后到达…

git删除已经提交的大文件

当你不小心把一个巨大的二进制文件提交到git仓库的时候&#xff0c;此时删除再提交也没有用了&#xff0c;大文件已经在仓库中留底了。另外比如需要删除某个需要保密的文件&#xff0c;都是相同的解决办法。 我本来想着把dll放在三方库里面提交到仓库里&#xff0c;省得在不同…

STM32 低功耗-待机模式

STM32 待机模式 文章目录 STM32 待机模式第1章 低功耗模式简介第2章 待机模式简介2.1 进入待机模式2.1 退出待机模式 第3章 待机模式代码部分总结 第1章 低功耗模式简介 在 STM32 的正常工作中&#xff0c;具有四种工作模式&#xff1a;运行、睡眠、停止和待机模式。 在系统或…

【九】mybatis 缓存模块设计

mybatis 缓存模块设计 简介&#xff1a;MyBatis提供了一级缓存和二级缓存&#xff0c;其中一级缓存基于SqlSession实现&#xff0c;而二级缓存基于Mapper实现。这里我们就来学习一下MyBatis缓存的使用&#xff0c;并分析MyBatis缓存的实现原理。 首先我们找到缓存模块的源码&a…

EVE-NG MPLS L2VPN static lsp

目录 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 2.2 配置MPLS LDP 2.3 配置L2VPN PW 2.4 验证L2VPN 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 PE1 interface LoopBack 0ip address 1.1.1.9 32 quitinterface GigabitEthernet1/0ip address 10.1.1.1 255.255…

【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio构建React完成点餐H5页面

前言 【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio 构建React完成点餐H5页面一、Cloud Studio介绍1.1 Cloud Studio 是什么1.2 相关链接1.3 登录注册 二、实战练习2.1 初始化工作空间2.2 开发一个简版的点餐系统页面1. 安装 antd-mobile2. 安装 less 和 less-loader3. …

网络安全之原型链污染

目录&#xff1a; 目录&#xff1a; 一、概念 二、举例 三、 实操了解 总结 四、抛出原题&#xff0c;历年原题复现 第一题&#xff1a; 五、分析与原理 第二题&#xff1a; 八、分析与原理 九、具体操作&#xff0c;payload与结果 结果&#xff1a; 一、概念 Java…

C++ 派生类的拷贝构造函数

当存在类的继承关系时&#xff0c;对于一个类&#xff0c;如果程序员没有编写拷贝构造函数&#xff0c;编译系统会在必要时自动生成一个隐含的拷贝构造函数&#xff0c;这个隐含的拷贝构造函数会自动调用基类的拷贝构造函数&#xff0c;然后对派生类新增的成员对象一一执行拷贝…

H5中的draggable

基本语法及事件 draggable 属性规定元素是否可拖动。必须设置&#xff0c;否则没有拖拽效果及事件触发 提示&#xff1a; 链接和图像默认是可拖动的。 提示&#xff1a; draggable 属性经常用于拖放操作 语法 <element draggable"true|false|auto"> 值描…

在服务器上搭建gitlab

目录 1.在服务器上下载gitlab 2.编辑站点位置 3.重载配置 4.访问gitlab 最终效果展示&#xff1a; 官方文档&#xff1a; 安装部署GitLab服务 1.在服务器上下载gitlab wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.0-ce.0.el7.x86_64.r…

Wavefront .OBJ文件格式解读【3D】

OBJ&#xff08;或 .OBJ&#xff09;是一种几何定义文件格式&#xff0c;最初由 Wavefront Technologies 为其高级可视化器动画包开发。 该文件格式是开放的&#xff0c;已被其他 3D 图形应用程序供应商采用。 OBJ 文件格式是一种简单的数据格式&#xff0c;仅表示 3D 几何体&…

Linux文本处理工具和正则表达式

Linux文本处理工具和正则表达式 一.查看、截取和修改文本的工具 1.查看文本的工具 cat 最常用的文件查看命令&#xff1b;当不指明文件或者文件名为一杠’-时&#xff0c;读取标准输入。 cat [OPTION]... [FILE]... -A&#xff1a;显示所有控制符(tab键:^I;行结束符:$) -…

01Mysql创建表

目录 一、题目要求 二、具体操作代码 三、查看结果&#xff1a; 一、题目要求 建立一张表&#xff1a; 表里面有多个字段&#xff0c;每一个字段对应一种数据类型 注意&#xff1a;表名&#xff0c;字段名都要起的有意义 二、具体操作代码 CREATE TABLE DataInfo (id INT …

Vercel 部署的项目发现APIkeys过期了怎么办

好不容易部署的Vercel&#xff0c;发现APIkeys过期了显示&#xff0c;查了查资料发现只要更新下新的apikeys&#xff0c;然后再重新部署下就好了。 重新设置APIkeys 1.1. 进去 Vercel 项目内部控制台&#xff0c;点击顶部的 Settings 按钮&#xff1b; 1.2 点击环境变量Enviorn…

计算机网络-性能指标

计算机网络-性能指标 文章目录 计算机网络-性能指标简介速率比特速率 带宽吞吐量时延时延计算 时延带宽积往返时间网络利用率丢包率总结 简介 性能指标可以从不同的方面来度量计算机网络的性能 常用的计算机网络的性能指标有以下8个 速率带宽吞吐量时延时延带宽积往返时间利…

远程连接身份验证错误,又找不到加密Oracle修正

一、问题描述 远程连接服务器出现了错误&#xff0c;错误信息为&#xff1a;远程连接身份验证错误&#xff0c;又找不到加密Oracle修正。 二、原因分析 出错原因&#xff1a;Windows的CVE-2018-0886 的 CredSSP 更新将CredSSP 身份验证协议默认设置成了“缓解”&#xff0c;…

华为发布数字资产继承功能

在华为开发者大会2023&#xff08;HDC.Together&#xff09;上&#xff0c;华为常务董事、终端BG CEO、智能汽车解决方案BU CEO余承东正式发布了数字资产继承功能&#xff0c;HarmonyOS提供了安全便捷的数字资产继承路径。 在鸿蒙世界中&#xff0c;我们每个人在每台设备、应用…

【C++】C++11 新特性总结 | C++ 常见设计模式总结(秋招篇)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言介绍几种C11新特性介绍一下自动类型推导auto和decltype关键字的用法举例讲一下范围基于的for循环介绍一下列表初始化讲一下右值引用&#xff0c;和左值引用的区…

微服务 云原生:搭建 Harbor 私有镜像仓库

Harbor官网 写在文前&#xff1a; 本文中用到机器均为虚拟机 CentOS-7-x86_64-Minimal-2009 镜像。 基础设施要求 虚拟机配置达到最低要求即可&#xff0c;本次系统中使用 docker 24.0.4、docker-compose 1.29.2。docker 及 docker-compose 的安装可以参考上篇文章 微服务 &am…

Java基础入门篇——Java虚拟机和运行环境(一)

目录 一、Java的发展简史和语言特点 1.1发展简史&#xff1a; 1.2语言特点&#xff1a; 二、Java运行机制 三、Java虚拟机 四、Java的运行环境 五、第一个Java程序——HelloWorld&#xff01; 六、总结 一、Java的发展简史和语言特点 Java是一种广泛使用的编程语言&a…