强大的JVM监控工具
介绍
在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的
名称 | 主要作用 |
---|---|
jps | 查看正在运行的Java进程 |
jstack | 打印线程快照 |
jmap | 导出堆内存映像文件 |
jstat | 查看jvm统计信息 |
jinfo | 实时查看和修改jvm配置参数 |
jhat | 用于分析heapdump文件 |
jps:查看正在运行的Java进程
jps可以列出正在运行的Java进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及进程id
「如果想看一个命令的后面加 -help参数即可」
[root@VM-0-14-centos ~]# jps -help
usage: jps [-help]jps [-q] [-mlvV] [<hostid>]Definitions:<hostid>: <hostname>[:<port>]
「可以看到可以监控远程服务,但是基于安全考虑,一般不使用」
常见的选项如下
选项 | 作用 |
---|---|
-q | 只输出进程id |
-m | 输出传递给主类main函数的参数 |
-l | 输出主类全类名,如果进程执行的是Jar包,输出jar包名字 |
-v | 程序启动时指定的jvm参数 |
root@localhost:~$ jps
70208 KmpService
183525 LinkAnalysisServer
25160 MipSerachServerroot@localhost:~$ jps -l
70208 com.st.kmp.main.KmpService
183525 com.st.cis.main.LinkAnalysisServer
25160 com.st.cis.main.MipSerachServer
jstack:打印线程快照
「查看某个Java进程中所有线程的状态。一般用来定位线程出现长时间停顿的原因,如发生死循环,死锁,请求外部资源长时间等待等!」
public class DeadLockDemo {private static Object lockA = new Object();private static Object lockB = new Object();public static void main(String[] args) {Thread threadA = new Thread(() -> {synchronized (lockA) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("get lockA");synchronized (lockB) {System.out.println("threadA run finish");}}});Thread threadB = new Thread(() -> {synchronized (lockB) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("get lockB");synchronized (lockA) {System.out.println("threadB run finish");}}});threadA.setName("myThreadA");threadB.setName("myThreadB");threadA.start();threadB.start();}
}
「写了一个死锁的例子,启动后执行jps找到进程id为19457」
root@localhost ~ % jps
19457 DeadLockDemo
19458 Launcher
2658
19459 Jps
接着执行如下命令,列出了这个进程每个线程的执行状态
jstack 19457
「从图中可以看到有很多线程,GC线程,myThreadA,myThreadB等,其中myThreadA和myThreadB的线程状态为BLOCKED,并且在最后提示出了死锁发生的位置」
jmap:导出堆内存映像文件
「jmap主要用来用来导出堆内存映像文件,看是否发生内存泄露等。」
生产环境一般会配置如下参数,让虚拟机在OOM异常出现之后自动生成dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/peng
执行如下命令即可手动获得dump文件
jmap -dump:file=文件名.dump 进程id
「分析堆内存的工具有很多,如Java VisualVM,jhat等。」
jstat:查看jvm统计信息
「jstat可以显示本地或者远程虚拟机进程中的类装载、 内存、 垃圾收集、 JIT编译等运行数据」
用jstat查看一下类装载的信息。一般很少使用这个命令,命令行看垃圾收集信息真不如看图形界面方便,就不多做介绍了。
[root@VM-0-14-centos ~]# jstat -class 19402
Loaded Bytes Unloaded Bytes Time 10229 19679.1 52 76.0 5.33
含义如下
Loaded | 解释 |
---|---|
Loaded | 加载类的个数 |
Bytes | 加载类的字节数 |
Unloaded | 卸载类的个数 |
Bytes | 卸载类的字节数 |
Time | 花费的时间 |
jinfo:实时查看和修改jvm配置参数
jinfo的作用是实时地查看和修改虚拟机各项参数。
「使用jps命令的**-v**
参数可以查看虚拟机启动时显式指定的参数列表」,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag
选项进行查询了(如果只限于JDK 1.6或以上版本的话,使用java -XX:+PrintFlagsFinal
查看参数默认值也是一个很好的选择)
「**jinfo flags pid**
在高版本才能正常使用,在jdk1.8这个版本不能正常使用」
应用程序设置如下参数
-Xmx10m -Xms10m
查看最大堆内存和是否打印GC日志,可以看到不打印GC日志 接着设置打印GC日志,再次查看,打印GC日志
root@localhost ~ % jinfo -flag MaxHeapSize 20253
-XX:MaxHeapSize=10485760
root@localhost ~ % jinfo -flag PrintGCDetails 20253
-XX:-PrintGCDetails
root@localhost ~ % jinfo -flag +PrintGCDetails 20253
root@localhost ~ % jinfo -flag PrintGCDetails 20253
-XX:+PrintGCDetails
「**Xmx**
是**MaxHeapSize**
的别名」
相关文章:

强大的JVM监控工具
介绍 在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的 名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用…...
python 实现点的多项式算法
点的多项式算法介绍 点的多项式算法通常指的是通过一组点(即数据点,通常包括自变量和因变量的值)来拟合一个多项式函数的方法。这种方法在数值分析、统计学、机器学习等领域中非常常见。下面是一些常见的多项式拟合算法: 1. 最小…...

Pikachu-暴力破解-验证码绕过(on client)
访问页面, 从burpsuite 上看到返回的源代码; 验证码生成时通过 createCode 方法生成,在前端页面生成; 同时也是在前端做的校验; 直接验证;F12 -- 网络,随便输入个账号、密码、验证码࿰…...
【Spring】Bean 的生命周期:从实例化到销毁
实例化阶段: Bean的实例化是通过反射创建的。Spring根据Component、Bean或者XML中的<bean>元素配置,来确定要创建的Bean。 属性赋值阶段: 实例化完成后,Spring会进行依赖注入。包括将属性值注入到Bean的字段中,…...

Ubuntu 安装RUST
官方给的是这样如下脚本 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 太慢了 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh -x 执行这个脚本后会给出对应的下载链接 如下图 我直接给出来 大多数应该都是这个 https://static.rust-…...

Android Compose的基本使用
前言: Compose这个东西呢,好处我没发现,坏处就是学习成本和低版本兼容. 不过,看在官方力推的份儿上,有空就学一下吧. 当初的kotlin,很多人说鸡肋(包括我)!现在不也咔咔用纯kotlin做项目吗?哈哈哈哈. 未来的事情,谁说得清呢? 首先创建一个专用的Compose项目 对没错!看到E…...

计算机网络:计算机网络体系结构 —— 专用术语总结
文章目录 专用术语实体协议服务服务访问点 SAP 服务原语 SP 协议数据单元 PDU服务数据单元 SDU 专用术语 实体 实体是指任何可以发送或接收信息的硬件或软件进程 对等实体是指通信双方处于相同层次中的实体,如通信双方应用层的浏览器进程和 Web 服务器进程。 协…...

Rust的前端Tauri编程-基于JS框架的初步探索
上次的项目做完后,有一项遗憾,没有返回结果,而结果是一个html表格,我想用html直接在窗口显示,这时发现R里面包括slint没有很直接的方法,直接弹出浏览器有点太简单没有挑战。这是就被推送了他的竞争对手&…...

【Flume Kafaka实战】Using Kafka with Flume
一 目标 在Cloudera Manager中创建两个Flume的Agent,Agent1从local file中获取内容,写入到kafka的队列中。Agent2以Agent1的sink作为source,将数据从kafka中读取出来,写入到HDFS中。 二 实战 2.1 Kafka Sink 第一步࿰…...

5G NR物理信号
文章目录 NR 物理信号与LTE的区别上行参考信号DMRS (UL)SRSPT-RS(UL) 下行参考信号DMRS(DL)PT-RS(DL)CSI-RSPSSSSS NR 物理信号与LTE的区别 用SSS、CSI-RS和DMRS 取代了CRS信号。下行业务信道采用TM1波束赋形传输模式。基于SSB 或者CSI-RS进行RSRP和SINR测量。基于DMRS 进行共…...

Pikachu-Cross-Site Scripting-存储型xss
存储型xss ,随便输入点内容,都能保存下来;刷新后也不会丢失;输入特殊字符,也能原样返回; 查看代码,也可以看到输出结果直接原路返回,不做处理 构造payload <script>alert(1)…...

媲美GPT-4o mini的小模型,Meta Llama 3.2模型全面解读!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...

【leetcode】 45.跳跃游戏 ||
如果我们「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少的跳跃次数。 例如,对于数组 [2,3,1,2,4,2,3],初始位置是下标 0,从下标 0 出发,最远可到达下标 2。下标 0 可到达的…...
coco(json)、yolo(txt)、voc(xml)标注格式的相互转换
一般都是用labeleme进行标注 标注格式都是json 然后根据不同的格式进行数据标注转换: 1.逐个json转xml: 当我们在使用数据集训练计算机视觉模型时,常常会遇到有的数据集只给了单个的json annotation文件,而模型所需要的annotation是基于每…...

以太网交换安全:端口安全
一、端口安全介绍 端口安全是一种网络设备防护措施,通过将接口学习到的动态MAC地址转换为安全MAC地址(包括安全动态MAC和Sticky MAC),阻止除安全MAC和静态MAC之外的主机通过本接口和设备通信,从而增强设备的安全性。以…...

[题解] Codeforces Round 976 (Div. 2) A ~ E
A. Find Minimum Operations 签到. void solve() {int n, k;cin >> n >> k;if (k 1) {cout << n << endl;return;}int ans 0;while (n) {ans n % k;n / k;}cout << ans << endl; }B. Brightness Begins 打表发现, 翻转完后的序列为: 0…...

【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?
前言: 零实习转行产品经理经验分享01-学习准备篇_哔哩哔哩_bilibili 该篇内容主要是对bilibili这个视频的观后笔记~谢谢美丽滴up主友情分享。 全文摘要:如何在0实习且没有任何产品相关经验下,如何上岸产品经理~ 目录 一、想清楚为什么…...

第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)征稿
第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)由湖南第一师范学院主办,南京师范大学、山东女子学院、爱迩思出版社(ELSP)协办。 大会将专注于机器人、数字化、自动化、人工智能等技术的开发和融合,…...

[数据集][目标检测]电力场景防震锤缺陷检测数据集VOC+YOLO格式705张1类别
重要说明:防震锤缺陷图片太难找,数据集里面存在大量单一场景图片,请仔细查看图片预览谨慎下载,此外数据集均为小目标检测,如果训练map偏低属于正常现象 数据集格式:Pascal VOC格式YOLO格式(不包含分割路径…...

【SpringBoot】
目录 一、Spring Boot概要 1. SpringBoot介绍 2. SpringBoot优点 3. SpringBoot缺点 4. 时代背景-微服务 二、Spring Boot 核心配置 1. Spring Boot配置文件分类 1.1 application.properties 1.2 application.yml 1.3 小结 2. YAML概述 3. YAML基础语法 3.1 注意事…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...

Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...