掌握 JVM 调优命令

news2024/11/28 12:32:57

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

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.coloradmin.cn/o/843757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

火力全开!百度文心3.5三大维度、20项指标国内问鼎!

近日&#xff0c;清华大学新闻与传播学院沈阳团队发布《大语言模型综合性能评估报告》&#xff08;下文简称“报告”&#xff09;&#xff0c;报告显示百度文心一言在三大维度20项指标中综合评分国内第一&#xff0c;超越ChatGPT&#xff0c;其中中文语义理解排名第一&#xff…

8.7一日总结

后台管理项目(使用vue3) 1.创建项目 npm init vuelatest 2.进入项目,下载依赖 3.下载需要的项目依赖 下载重置样式表 npm install reset-css 在main.js中阴入 import reset-css 4.清理目录 将项目中不需要的内容删除 5.运行项目 npm run dev 6.将仓库推送…

Kubectl 详解

目录 陈述式资源管理方法:项目的生命周期:创建-->发布-->更新-->回滚-->删除声明式管理方法:陈述式资源管理方法: kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将…

线程池优雅关闭

背景 线程池是日常我们写代码时经常打交道的知识点了&#xff0c;围绕线程池除了core核心线程数和最大max线程数的知识点外&#xff0c;我们一般会忽略然而却绕不开的问题时如何关闭线程池 如何关闭线程池 首先从优雅关闭线程池代码说起&#xff1a; public boolean graful…

在oracle SQL中创建返回表的函数

这是我的职责 create or replace FUNCTION split(i_str IN VARCHAR2,i_delim IN VARCHAR2 DEFAULT : ) RETURN TABLE AS BEGINRETURN SELECT trim(regexp_substr(i_str, [^||i_delim||], 1, LEVEL)) str FROM projetCONNECT BY instr(i_str, i_delim, 1, LEVEL - 1) …

Android安卓实战项目(10)---详细记录饮食与训练计划App【大Demo】可记录每日消耗和数据面板(源码在文末)可用于比赛项目或者作业参考中

Android安卓实战项目&#xff08;10&#xff09;—详细记录饮食与训练计划App【大Demo】可记录每日消耗和数据面板&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09;可用于比赛项目或者作业参考中 【bilibili演示】 https://www.bilibili.com/video…

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】

决策树进行鸢尾花分类的案例 背景说明&#xff1a; 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型&#xff0c;这是一个分类模型案例&#xff0c;通过该案例&#xff0c;可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…

算法通关村第四关——如何基于数组实现栈

1.栈的基础知识 1.1 栈的特征 栈&#xff08;Stack&#xff09;&#xff1a;具有一定操作约束的线性表&#xff0c;只在一端&#xff08;栈顶&#xff0c;Top&#xff09;做插入&#xff08;Push&#xff09;、删除(Pop)&#xff0c;不可操作的一端称为栈底&#xff08;Botto…

C高级--day4(wc指令、case...in、while循环、for循环、select..in、break、continue、shell中的函数)

#!/bin/bash function fun() {uidid -u $namegidid -g $nameecho $uid $gid } read name retfun $name echo $ret

【docker】设置 docker 国内镜像报错问题,解决方案

一、报错&#xff1a; [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因&#xf…

UE5 半透明覆层材质

文章目录 前言介绍示例1示例2示例3 前言 本文采用虚幻5.2.1版本演示&#xff0c;介绍半透明覆层材质&#xff08;覆层材质&#xff09;。 介绍 半透明覆层材质是 UE5.1 版本 更新的功能&#xff0c;使用半透明覆层材质&#xff0c;可以轻松的给物体表面附着一层材质。 在UE5…

【Maven】常用命令、插件管理、私服nexus

【Maven】常用命令、插件管理、私服nexus 常用命令 插件管理 私服nexus Nexus3 配置私服 项目pom中的配置 发布时区分正式版、快照版 常用命令 Maven提供了一系列常用命令&#xff0c;用于构建、测试和管理项目。以下是一些常用的Maven命令示例&#xff1a; mvn clean:…

安装zabbix5.0监控

官网安装手册&#xff1a; https://www.zabbix.com/cn/download 一、 安装zabbix a. 安装yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpmyum clean allb. 安装Zabbix server&#xff0c;web前端&#xff0c;agent y…

面试热题(翻转k个链表)

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值&a…

《论文阅读13》Efficient Urban-scale Point Clouds Segmentationwith BEV Projection

一、论文 研究领域&#xff1a; 城市级3D语义分割论文&#xff1a;Efficient Urban-scale Point Clouds Segmentationwith BEV Projection论文链接 注&#xff1a; BEV&#xff1a; Birds Eye View BEV投影是指鸟瞰视角(Birds Eye View,简称BEV)的一种从上方观看对象或场景的…

【JavaEE】Spring Boot - 配置文件

【JavaEE】Spring Boot 开发要点总结&#xff08;2&#xff09; 文章目录 【JavaEE】Spring Boot 开发要点总结&#xff08;2&#xff09;1. 配置文件的两种格式2. .properties 文件2.1 基本语法2.2 注释2.3 配置项2.4 主动读取配置文件的键值2.5 数据库的连接时的需要的信息配…

面试热题(字符串相加)

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 输入&#xff1a;num1 "11"…

Mermaid系列之FlowChart流程图

一.欢迎来到我的酒馆 介绍mermaid下&#xff0c;Flowchat流程图语法。 目录 一.欢迎来到我的酒馆二.什么是mermiad工具三.在vs code中使用mermaid四.基本语法 二.什么是mermiad工具 2.1 mermaid可以让你使用代码来创建图表和可视化效果。mermaid是一款基于javascript语言的图表…

排序进行曲-v4.0

文章目录 小程一言快速排序步骤详细解释具体步骤 举例总结 复杂度分析时间复杂度分析&#xff1a;空间复杂度分析&#xff1a;注意 应用场景总结 实际举例结果总结 代码实现结果解释 小程一言 这篇文章是在排序进行曲3.0之后的续讲&#xff0c; 这篇文章主要是对快速排序进行细…

二、框架篇

框架篇 Spring 1. 基础核心技术 第1章-Spring的模块与应用场景 第2章-Spring基于XML配置的容器 第3章-Spring基于注解配置的容器 第4章-Spring基于Java配置的容器 第5章-Spring三种配置方式的混合和迁移 第6章-Spring同类型多个Bean的注入 第7章-Spring的Bean生命周期…