JVM学习-监控工具(二)

jmap:导出内存映像文件&内存使用情况
基本情况
  • jmap(JVM Memory Map):一方法获取dump文件(堆转储快照文件,二进制文件),还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息
基本语法
  • jmap [option]
    (to connect to running process)
  • jmap [option] <executable
    (to connect to a core file)
  • jmap [option] [server_id@]
    (to connect to remote debug server)
  • option包括下表:
    在这里插入图片描述
  • -dump
  • 生成Java堆转储快照:dump文件
  • 特别的:-dump:live只保存堆中的存活对象
  • -heap
  • 输出整个堆空间的详细信息,包括GC的使用,堆配置信息以及内存使用信息
  • -histo
  • 输出堆空间中对象的统计信息,包括类,实例数量和合计容量
  • -permstat
  • 以ClassLoader为统计口径输出永久代的内存状态信息
  • finalizeinfo
  • 显示在F-Queue中等待Finalizer线程执行finalize方法的对象
  • -F
  • 当虚拟机进程对-dump选项没有任何响应时,强制执行生成dump文件
  • -h | -help
  • 帮助命令
  • -J
  • 传递参数给jmap启动的jvm
导出内存映射文件
  • 将堆中所有存活对象导出至一个文件之中
  • Heap Dump又叫堆存储文件,指一个Java进程在某个时间点的内存快照,Heap Dump在触发内存快照的时候会保存此该的信息
  • All Objects
  • All Classes
  • Garbage Collection Roots
  • Thread Stacks and Local Variables
  • ①通常在写Heap Dump文件前会触发一次Full GC,所以heap dump文件里保存的都是Full GC后留下的对象信息
  • ②由于生成dump文件比较耗时,需要耐心等待,尤其大内存镜像生成dump文件,则需要耗费更长的时间来完成
  • 手动方式
  • jmap -dump:format=b,file=<filename.hprof> 注:format=b表示采用图形化工具能打开对应的hprof文件
  • jmap -dump:live,format=b,file=<filename.hprof>
  • 自动方式
  • 当程序发生OOM退出系统时,一些瞬时停止都随着程序的终止而消失,而重现OOM问题往往比较困难或者耗时,此时若能在OOM时,自动导出dump文件就显得很重要
  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=<filename.hprof>
显示堆内存相关信息
  • -heap pid:程序运行时
  • -histo pid
其它作用
  • -pemstat pid :查看系统的ClassLoader信息–linux环境下
  • -finzlizerinfo:查看堆积在finalizer队列中的对象–linux环境下
总结
  • 由于jmap将访问堆中的所有对象,为了保证在此过程中不被应用线程干扰,jmap需要借助安全点机制,让所有线程停留在不改变堆中数据的状态,由jmap导出的堆快照必定是安全点位置的,这可能导致基于该堆快照的分析结果存在偏差
  • 举个例子:假设在编译生成的机器码中,某些对象的生命周期在两个安全点之间,那么:live选项将无法探知到这些对象
  • 如果某个线程长时间无法跑到安全点,jmap将一直等下去,与前面的jstat不同,垃圾回收器会主动将jstat所需要的摘要数据保存至固定位置之中,而jstat只需直接读取即可
jhat(JVM Heap Analysis Tool)
  • 基本情况
  • Sun JDK提供了jhat与jmap命令搭配使用,用于分析jmap生成的heap dump文件,jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,用户可以在浏览器中查看分析结果
  • 使用了jhat命令,就启动了一个http服务,端口7000,通过在浏览器中输入http://localhost:7000获取分析结果
  • jhat在jdk9,10中已经被删除,官方建议VisualVM代替
  • 基本语法
  • -stack false | true:关闭 | 打开对象分配调用栈跟踪
  • -refs false | true : 关闭 | 打开对象引用跟踪
  • -port port-number 设置jhat HTTP Server端口,默认7000
  • -exclude exclude-file:执行对象查询时需要排除的数据成员
  • -baseline exclude-file:指定一个基准堆转储
  • -debug int:设置Debug级别
  • -version:启动后显示版本信息就退出
  • -J :传入启动参数,
jstack(JVM Stack Trace)
  • 用于生成虚拟机指定进程当前时刻的线程快照,线程快照是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合
  • 生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环,请求外部资源导致的长时间等待等问题,这些都是导致线程长时间停顿的常见原因,当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况
  • 在thread dump中,要留意以下几种状态
  • 死锁,Deadlock
  • 等待资源,Waiting on condition
  • 等待获取监视器,Waiting on monitor entry
  • 阻塞,Blocked
  • 执行中,Runnable
  • 暂停,Suspended
//①线程死锁查看
package com.chapter12;
public class ThreadDeadLock {public static void main(String[] args) {StringBuilder s1 = new StringBuilder();StringBuilder s2 = new StringBuilder();new Thread() {@Overridepublic void run() {synchronized (s1) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s2) {s1.append("b");s2.append("2");System.out.println(s1);System.out.println(s2);}}}}.start();new Thread() {@Overridepublic void run() {synchronized (s2) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s1) {s1.append("d");s2.append("4");System.out.println(s1);System.out.println(s2);}}}}.start();}
}
C:\Users\Administrator\IdeaProjects\jvm>jstack 12840
执行结果:
Found one Java-level deadlock:
=============================
"Thread-1":waiting to lock monitor 0x0000000002d0b288 (object 0x000000071649ee08, a java.lang.StringBuilder),which is held by "Thread-0"
"Thread-0":waiting to lock monitor 0x0000000002d0c728 (object 0x000000071649ee50, a java.lang.StringBuilder),which is held by "Thread-1"Java stack information for the threads listed above:
===================================================
"Thread-1":at com.chapter12.ThreadDeadLock$2.run(ThreadDeadLock.java:40)- waiting to lock <0x000000071649ee08> (a java.lang.StringBuilder)- locked <0x000000071649ee50> (a java.lang.StringBuilder)
"Thread-0":at com.chapter12.ThreadDeadLock$1.run(ThreadDeadLock.java:22)- waiting to lock <0x000000071649ee50> (a java.lang.StringBuilder)- locked <0x000000071649ee08> (a java.lang.StringBuilder)Found 1 deadlock.
//①线程Sleep查看
public class ThreadSleepTest {public static void main(String[] args) {System.out.println("hello - 1");try {Thread.sleep(1000 * 60 * 10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello - 2");}
}
//执行结果
>> jstack 920
"main" #1 prio=5 os_prio=0 tid=0x00000000036d2800 nid=0x1cb0 waiting on condition [0x000000000320f000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at com.chapter12.ThreadSleepTest.main(ThreadSleepTest.java:12)
//③线程同步测试
class Number implements Runnable {private int number = 1;@Overridepublic void run() {while (true) {synchronized (this) {if (number <= 100) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":" + number);number++;} else {break;}}}}
}
public class ThreadSyncTest {public static void main(String[] args) {Number number = new Number();Thread t1 = new Thread(number);Thread t2 = new Thread(number);t1.setName("线程1");t2.setName("线程2");t1.start();t2.start();}
}
//执行结果
"线程2" #12 prio=5 os_prio=0 tid=0x0000000027b56800 nid=0x3380 waiting on condition [0x000000002879f000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at com.chapter12.Number.run(ThreadSyncTest.java:15)- locked <0x00000007164a1960> (a com.chapter12.Number)at java.lang.Thread.run(Thread.java:748)"线程1" #11 prio=5 os_prio=0 tid=0x0000000027b4d800 nid=0x1d18 waiting for monitor entry [0x000000002869f000]java.lang.Thread.State: BLOCKED (on object monitor)at com.chapter12.Number.run(ThreadSyncTest.java:13)- waiting to lock <0x00000007164a1960> (a com.chapter12.Number)at java.lang.Thread.run(Thread.java:748)
  • 基本语法
  • -F:当正常输出的请求不被响应时,强制输出线程堆栈
  • -l:除堆栈外,显示关于锁的附加信息
  • -m:如果调用到本地方法的话,可以显示C/C++堆栈
  • -h:帮助操作
jcmd
基本情况
  • 它是一个多功能工具,可以实现除了jstat之外所有命令的功能,用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等
基本语法
  • -l:列出所有的JVM进程
  • pid help:针对指定的进程,
  • pid 具体命令

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

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

相关文章

MyBatis学习(二)--MyBatis获取参数值的两种方式

1、搭建新的module:mybatis_parameter MyBatis获取参数值的两种方式&#xff1a;${}和#{} ${}的本质就是字符串拼接&#xff0c;采用sql拼接&#xff0c;无法防止sql注入 #{}的本质就是占位符赋值 &#xff0c;采用预编译 防止sql注入 不同参数使用案例 2、单个字面量类型…

OpenHarmony嵌套类对象属性变化:@Observed装饰器和@ObjectLink装饰器

上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二…

实时瞳孔分割算法-RITnet论文复现

源代码在这里RITnet-Github 这个模型比较小众&#xff0c;我们实验室使用了官方提供的模型进行瞳孔中心位置提取&#xff0c;以实现视线追踪&#xff0c;效果很好 一、数据集准备 RITnet也是那一届openEDS数据集挑战赛的冠军模型&#xff0c;openEDS数据集可以从Kaggle上下载&a…

数据结构--关键路径

事件v1-表示整个工程开始&#xff08;源点&#xff1a;入度为0的顶点&#xff09; 事件v9-表示整个工程结束&#xff08;汇点&#xff1a;出度为0的顶点&#xff09; 关键路径&#xff1a;路径长度最长的路径 求解关键路径问题&#xff08;AOE网&#xff09; 定义四个描述量 …

网络网络层之(6)ICMPv4协议

网络网络层之(6)ICMPv4协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…

大模型备案项目补贴政策一览【保持更新】

大模型项目、AI类项目、大模型备案通过后等一篮子财政补贴政策 上海市 加快创新体系构建 1. 提升自主创新水平&#xff1a;对引领大模型发展或取得颠覆性突破的项目&#xff0c;最高给予1000万元补贴支持。 2. 加强算力资源保障&#xff1a;实施算力伙伴计划&#xff0c;对…

力扣174题动态规划:地下城游戏(含模拟面试)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业…

Java进阶学习笔记36——算法

什么是算法&#xff1f; 解决某个实际问题的过程和方法。 1&#xff09;导航&#xff1b; 2&#xff09;滴滴打车&#xff1b; 3&#xff09;抖音&#xff1b; 不同的算法&#xff0c;效率高、性能好&#xff01; 在Java中&#xff0c;代码已经帮我们写好了&#xff0c;但为…

离散点云拟合三维平面参数推导(基于最小二乘)

1、背景介绍 实际中&#xff0c;很多人工构造物是由平面结构构造而成&#xff0c;如下图所示&#xff0c;为一典型的由多个平面组成的人工构筑物。因此&#xff0c;根据离散点拟合成平面&#xff0c;获取拟合平面方程&#xff0c;是点云数据处理中非常常见的数据处理操作。 2、…

鸿蒙Ability Kit(程序框架服务)【ExtensionAbility组件】

ExtensionAbility组件 ExtensionAbility组件是基于特定场景&#xff08;例如服务卡片、输入法等&#xff09;提供的应用组件&#xff0c;以便满足更多的使用场景。 每一个具体场景对应一个[ExtensionAbilityType]&#xff0c;开发者只能使用&#xff08;包括实现和访问&#…

WPS的excel表格设置了编辑权限,要怎么取消?

在日常生活和工作中&#xff0c;我们经常会使用WPS Office办公软件来处理各种文档&#xff0c;其中WPS Excel表格是我们进行数据处理和分析的重要工具。为了保护表格中的数据不被随意修改&#xff0c;我们有时会设置编辑权限。然而&#xff0c;随着时间的推移或需求的变更&…

基于FPGA的SystemVerilog练习

文章目录 一、认识SystemVerilogSystemVerilog的语言特性SystemVerilog的应用领域SystemVerilog的优势SystemVerilog的未来发展方向 二、流水灯代码流水灯部分testbench仿真文件 三、用systemVerilog实现超声波测距计时器测距部分led部分数码管部分采样部分顶层文件引脚绑定效果…

dpdk uio整体分析及网卡加载

参考:https://zhuanlan.zhihu.com/p/477600165 一、Linux内核知识点 1. __attribute__ constructor/destructor (1)若函数被设定为constructor属性,则该函数会在 main()函数执行之前被自动的执行。 (2)若函数被设定为destructor属性,则该函数会在main()函数执…

开发和渗透偷懒利器utools

目录 1.前言 1.1 工具简介 1.2 核心特性 1.3 使用场景 1.4 安装与使用 1.4.1 下载&#xff1a; 1.4.2 安装&#xff1a; 1.4.3 配置&#xff1a; 1.4.4 插件市场&#xff1a; 2.懒狗插件介绍 基本介绍 2.1 数据模拟 2.2 随机生成虚假数据 2.3 API市场 2.4 Hoppscot…

【十二】图解mybatis日志模块之设计模式

图解mybatis日志模块之设计模式 概述 最近经常在思考研发工程师初、中、高级工程师以及系统架构师各个级别的工程师有什么区别&#xff0c;随着年龄增加我们的技术级别也在提升&#xff0c;但是很多人到了高级别反而更加忧虑&#xff0c;因为it行业35岁年龄是个坎这是行业里的共…

一文读懂数据库中的DB、DBMS、DBS、DBAS

目前数据库的应用非常广泛,几乎各行各业都在直接或间接地与数据库打交道,例如网上购物、银行业务、铁路购票和酒店住宿等。在实际应用中,数据库、数据库管理系统、数据库系统和数据库应用系统经常被统称为数据库,而实质上这4个概念是不一样的,它们具有不同的定义和含义。下…

暴力数据结构之排序大杂烩

1. 冒泡排序&#xff1a;O(N^2) 逻辑解析&#xff1a; 冒泡排序并没有什么实际意义&#xff0c;但是有教学意义&#xff0c;相信大部分小白在学习的初期第一个接触的排序就是冒泡排序。那么接下来我们了解一下他的底层逻辑&#xff1a; 冒泡排序顾名思义就是将最大&#xff08…

idea项目maven下载依赖报错

报错&#xff1a; 1、Failure to find bad.robot:simple-excel:jar:1.0 in https://maven.aliyun.com/repository/public was cached in the local repository, resolution will not be reattempted until the update interval of aliyunmaven has elapsed or updates are forc…

python的while循环与for循环总结

前两章中&#xff0c;我们跟着海绵宝宝的故事&#xff0c;掌握了 while 循环和 for 循环&#xff0c;这两种不同的循环模式。while 循环和 for 循环都需要有 循环体 和 缩进&#xff0c;我们来复习一下它俩的语法规则&#xff1a; while 循环与 for 循环辨析 学到这里&#x…

在鲲鹏服务器搭建k8s高可用集群分享

高可用架构 本文采用kubeadm方式搭建k8s高可用集群&#xff0c;k8s高可用集群主要是对apiserver、etcd、controller-manager、scheduler做的高可用&#xff1b;高可用形式只要是为&#xff1a; 1. apiserver利用haproxykeepalived做的负载&#xff0c;多apiserver节点同时工作…