当前位置: 首页 > news >正文

掌握 JVM 调优命令

常用命令

  • 1、jps查看当前 java 进程
  • 2、jinfo实时查看和调整 JVM 配置参数
  • 3、jstat查看虚拟机统计信息
  • 4、jstack查看线程堆栈信息
  • 5、jmap查看堆内存的快照信息

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

1、jps查看当前 java 进程

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

jps [options]
其中,常用的选项有:
-l:显示主类的完整路径名。
-p:显示进程的当前线程所在的工作进程组。
-s:显示进程的启动时间。
-v:显示进程的虚拟机信息,如JVM版本、GC类型等。

  • 要查看当前所有正在运行的Java进程及其相关信息,可以输入命令:jps
  • 要查看主类的完整路径名,可以输入命令:jps -l
  • 要查看进程的启动命令行参数字符串,可以输入命令:jps -m
  • 需要注意的是,由于 jps 命令直接读取 Java 虚拟机的内部数据,因此需要确保当前用户具有足够的权限才能使用。

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

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

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 [+|-]

需要指定参数值的类型使用方法:
jinfo -flag =value

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
在这里插入图片描述

3、jstat查看虚拟机统计信息

jstat 是 Java 虚拟机自带的命令行工具,用于查看 Java 虚拟机的运行状态和性能统计信息。它可以用来监测 Java 虚拟机的内存使用情况、垃圾回收情况、类加载情况等。ID,可以通过"jps"命令来获取。"interval"是两次统计之间的时间间隔(单位为毫秒),"count"是要统计的次数。
官网链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE

jstat 使用方法:jstat <间隔时间> <统计次数>
例如,要查看类加载信息,可以使用以下命令:

jstat -class < pid>

这将输出Java虚拟机的类加载信息,包括已加载的类数、已卸载的类数、当前正在加载的类等。
使用 jstat 查看类加载器的统计信息,默认的间隔时间是毫秒,如下:
在这里插入图片描述
例如,要查看Java虚拟机的内存使用情况,可以使用以下命令:

jstat -gcutil < pid>

这将输出Java虚拟机的垃圾回收器的统计信息,包括堆区的使用情况、空闲情况等。
使用 jstat 查看垃圾收集统计信息的摘要,如下:
在这里插入图片描述

4、jstack查看线程堆栈信息

官网链接: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;}
}

在这里插入图片描述
我们通过 jstack 命令查看一下线程的堆栈信息:

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

在堆栈信息的最后可以发现死锁的产生,如下:
在这里插入图片描述
2、利用 jstack 定位某个进程中 CPU 占用高的线程问题
步骤一:使用 top 命令查看 CPU 占用高的进程,假设找到 %CPU 占比高的进程 PID 为 17896。(小技巧:top 显示界面,输入大写 P,结果按 CPU 占用降序排序;输入大写 M,结果按内存占用降序排序。【大写 P 可以在 caps lock 状态输入 p,或者按 Shift+p】)

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

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

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

5、jmap查看堆内存的快照信息

使用 jmap -heap < pid> 查看堆内存信息,启动程序时配置 JVM 参数,-Xms30M -Xmx30M
在这里插入图片描述
1、dump 出堆内存信息

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

注意:-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 测试";
}

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

JVM 调优工具

相关文章:

掌握 JVM 调优命令

常用命令 1、jps查看当前 java 进程2、jinfo实时查看和调整 JVM 配置参数3、jstat查看虚拟机统计信息4、jstack查看线程堆栈信息5、jmap查看堆内存的快照信息 JVM 日常调优总结起来就是&#xff1a;首先通过 jps 命令查看当前进程&#xff0c;然后根据 pid 通过 jinfo 命令查看…...

扩增子分析流程——Lotus2: 一行命令完成所有分析

为什么介绍lotus2 因为快&#xff0c;作者比较了lotus2流程和qiime2、dada2、vsearch等&#xff0c;lotus2的速度最快、占用内存最小。 因为方便&#xff0c;只需要一行代码&#xff0c;即可完成全部分析。 lotus2 -i Example/ -m Example/miSeqMap.sm.txt -o myTestRun而且分…...

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

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

Ceph入门到精通-远程开发Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 服务器生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa Winscp下载 Downloading WinSCP-6.1.1-Setup.exe :: WinSCP window 生成密钥 打开powershell ssh-keygen -t rsa 注意路径 …...

APP外包开发的开发语言对比

在开发iOS APP时有两种语言可以选择&#xff0c;Swift&#xff08;Swift Programming Language&#xff09;和 Objective-C&#xff08;Objective-C Programming Language&#xff09;&#xff0c;它们是两种不同的编程语言&#xff0c;都被用于iOS和macOS等苹果平台的软件开发…...

基于Python++PyQt5马尔科夫模型的智能AI即兴作曲—深度学习算法应用(含全部工程源码+测试数据)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PC环境配置 模块实现1. 钢琴伴奏制作1&#xff09;和弦的实现2&#xff09;和弦级数转为当前调式音阶3&#xff09;根据预置节奏生成伴奏 2. 乐句生成1&#xff09;添加音符2&#xff09;旋律生成3&#xff09;节…...

Android中简单封装Livedata工具类

Android中简单封装Livedata工具类 前言&#xff1a; 之前讲解过livedata和viewmodel的简单使用&#xff0c;也封装过room工具类&#xff0c;本文是对livedata的简单封装和使用&#xff0c;先是封装了一个简单的工具类&#xff0c;然后实现了一个倒计时工具类的封装. 1.LiveD…...

国内大模型在局部能力上已超ChatGPT

中文大模型正在后来居上&#xff0c;也必须后来居上。 数科星球原创 作者丨苑晶 编辑丨大兔 从GPT3.5彻底出圈后&#xff0c;大模型的影响力开始蜚声国际。一段时间内&#xff0c;国内科技公司可谓被ChatGPT按在地上打&#xff0c;毫无还手之力。 彼时&#xff0c;很多企业…...

监控设置ip地址怎么设置

监控设备的IP地址设置是保障监控系统正常工作的基础。通过设置IP地址&#xff0c;我们可以确定监控设备在局域网内的位置&#xff0c;并远程访问监控设备进行实时查看、存储视频等操作。下面虎观代理小二二将介绍具体步骤。 方法一&#xff1a; 和电脑连接在一起&#xff0c;…...

力扣:56. 合并区间(Python3)

题目&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 来源&#xff1a;力扣&#xff08;Lee…...

最小二乘问题和非线性优化

最小二乘问题和非线性优化 0.引言1.最小二乘问题2.迭代下降法3.最速下降法4.牛顿法5.阻尼法6.高斯牛顿(GN)法7.莱文贝格马夸特(LM)法8.鲁棒核函数 0.引言 转载自此处&#xff0c;修正了一点小错误。 1.最小二乘问题 在求解 SLAM 中的最优状态估计问题时&#xff0c;我们一般…...

Selenium/webdriver原理解析

最近在看一些底层的东西。driver翻译过来是驱动&#xff0c;司机的意思。如果将webdriver比做成司机&#xff0c;竟然非常恰当。 我们可以把WebDriver驱动浏览器类比成出租车司机开出租车。在开出租车时有三个角色&#xff1a; 乘客&#xff1a;他/她告诉出租车司机去哪里&…...

多用户跨境B2B2C商城后台管理系统快速搭建

搭建一个多用户跨境B2B2C商城后台管理系统需要考虑多个方面&#xff0c;包括系统架构设计、用户权限管理、商品管理、订单管理、支付管理、物流管理等。搭建步骤如下&#xff1a; 1. 系统架构设计 首先&#xff0c;需要设计一个稳定可靠的系统架构。选择一个适合B2B2C商城的商…...

MySQL 优化

问题描述 MySQL 的性能优化分为四个部分&#xff1a; 硬件和操作系统层面的优化架构设计层面的优化MySQL 程序配置优SQL 优化 一、硬件及操作系统层面优化 从硬件层面来说&#xff0c;影响 Mysql 性能的因素有&#xff0c;CPU、可用内存大小、磁盘读写速度、 网络带宽。 从操作…...

VMware Workstation及CentOS-7虚机安装

创建新的虚机&#xff1a; 选择安装软件&#xff08;这里选的是桌面版&#xff0c;也可以根据实际情况进行选择&#xff09; 等待检查软件依赖关系 选择安装位置&#xff0c;自主配置分区 ​​​​​​​ 创建一个普通用户 安装完成后重启 点击完成配置&#xff0c;进入登陆界面…...

双向带头循环链表+OJ题讲解

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…...

电脑开不了机如何解锁BitLocker硬盘锁

事情从这里说起&#xff0c;不想看直接跳过 早上闲着无聊&#xff0c;闲着没事干&#xff0c;将win11的用户名称改成了含有中文字符的用户名&#xff0c;然后恐怖的事情发生了&#xff0c;蓝屏了… 然后就是蓝屏收集错误信息&#xff0c;重启&#xff0c;蓝屏收集错误信息&…...

Python Web开发 Jinja2模板引擎

在之前的文章中&#xff0c;简单介绍了Python Web开发框架Flask&#xff0c;知道了如何写个Hello World&#xff0c;但是距离用Flask开发真正的项目&#xff0c;还有段距离&#xff0c;现在我们目标更靠近一些 —— 学习下Jinja2模板。 模板的作用 模板是用来做什么的呢&…...

ubuntu上安装mosquitto服务

1、mosquitto是什么 Mosquitto 项目最初由 IBM 和 Eurotech 于 2013 年开发&#xff0c;后来于 2016 年捐赠给 Eclipse 基金会。Eclipse Mosquitto 基于 Eclipse 公共许可证(EPL/EDL license)发布&#xff0c;用户可以免费使用。作为全球使用最广的 MQTT 协议实现之一 &#x…...

嵌入式开发学习(STC51-9-led点阵)

内容 点亮一个点&#xff1b; 显示数字&#xff1b; 显示图像&#xff1b; LED点阵简介 LED 点阵是由发光二极管排列组成的显示器件 通常应用较多的是8 * 8点阵&#xff0c;然后使用多个8 * 8点阵可组成不同分辨率的LED点阵显示屏&#xff0c;比如16 * 16点阵可以使用4个8 *…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...