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.rhkb.cn/news/339870.html

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

相关文章

多线程新手村5--线程池

1.1 线程池是什么 线程诞生的意义是因为进程的创建/销毁开销太大&#xff0c;所以使用线程提高代码的执行效率&#xff1b;那如果想要进一步提升执行效率&#xff0c;该怎么办呢&#xff1f;有一个方法是使用线程池。 首先&#xff0c;什么是线程池&#xff1a;池就是池子&am…

奶茶店、女装店、餐饮店是高危创业方向,原因如下:

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 现在的俊男靓女们&#xff0c;心中都有一个执念&#xff1a; (1)想证明自己了&#xff0c;开个奶茶去…… (2)想多赚点钱了&#xff0c;加盟餐饮店去…… (3)工作不顺心了&#xff0c;搞个女装店去…… 但凡抱着…

102.网络游戏逆向分析与漏洞攻防-ui界面的设计-反隐身功能的界面设计与实现(有不使用MFC生成,自己手写代码创建复选框与事件的例子)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

独立游戏开发的 6 个步骤

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

discuz论坛怎么修改备案信息

大家好&#xff0c;今天给大家分享下discuz如何填写备案信息并且展示在网站首页。大家都知道国内网站都需要备案&#xff0c;不通过备案的网站上是没办法通过域名打开的。大家也可以通过搜索网创有方&#xff0c;或者直接点击网创有方 查看悬挂备案号后的效果。 首先大家可以看…

MySQL表的增删改查初阶(上篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

成人本科毕业论文怎么写?分享自己的经验

撰写成人本科毕业论文是一个系统而深入的过程&#xff0c;以下是我个人的经验分享&#xff0c;希望能帮助你更好地完成这一任务&#xff1a; 1. 明确论文选题 兴趣与专长&#xff1a;选择自己感兴趣且有一定专长的领域&#xff0c;这样更容易深入研究。可行性&#xff1a;确保…

【全开源】种草分享|动态朋友圈|瀑布流|uniapp

一款基于FastadminThinkPHP和Uniapp开发的种草分享评论点赞消息提醒系统&#xff0c;发布动态&#xff0c;分享种草生活&#xff0c;可以收藏关注点赞&#xff0c;消息提醒&#xff0c;同时支持H5/小程序/app多端。 ​让每一次互动都不再错过&#x1f514; &#x1f331; 种草…

spring boot 中的异步@Async

spring boot 开启异步调用 1、启动类上添加EnableAsync注解&#xff0c;表示启动异步 2、在具体实现异步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…

HTML5的标签(文本链接、图片路径详解)

目录 前言 一、文本链接 超链接表述 二、图片路径详解 绝对路径 相对路径 网络路径 前言 一、文本链接 超链接表述 HTML 使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;…

[FreeRTOS 基础知识] 堆

文章目录 堆的概念使用C语言实现 堆堆空间解析 堆的概念 所谓的堆就是一块空间的内存&#xff0c;可以来管理这块内存。从这块内存中取出一部分然后再释放回去。 使用C语言实现 堆 char heap_buf[1024]; // 定义一个堆空间 int pos0; // 当前…

文件上传题目练习

[HNCTF 2022 Week1]easy_upload 先尝试上传一个php文件&#xff0c;发现直接就成功了 用蚁剑测试连接成功 找到flag [NISACTF 2022]bingdundun~ 白名单上传 这里因为尝试了很多绕过方式都不成功&#xff0c;去搜索了一下wp&#xff0c;发现要用到Phar://伪协议 补充&#xff…

恒创科技:无法与服务器建立安全连接怎么解决?

在使用互联网服务时&#xff0c;有时会出现无法与服务器建立安全连接的问题&#xff0c;此错误消息通常出现在尝试访问需要安全连接的网站(例如使用 HTTPS 的网站)时&#xff0c;这可能是由于多种原因造成的&#xff0c;以下是一些常见的解决方法&#xff0c;帮助你解决问题。 …

VR导航的实现原理、技术优势和应用场景

VR导航通过虚拟现实技术提供沉浸式环境&#xff0c;结合室内定位技术实现精准导航。目前&#xff0c;VR导航已在多个领域展现出其独特的价值和潜力&#xff0c;预示着智能导航系统的未来发展。 一、实现原理 VR导航技术依托于虚拟现实(VR)和室内定位系统。VR技术利用计算机模…

先进的无人机GPS/GNSS模块解决方案

由于多星座支持和增强的信号接收能力&#xff0c;先进的GNSS模块提供了更高的精度和可靠性。集成传感器融合补偿信号中断&#xff0c;实现无缝导航。内置实时运动学(RTK)支持提供厘米级的定位精度。这些模块还优先考虑低功耗和紧凑的尺寸&#xff0c;确保更长的飞行时间和对无人…

2024.6.2练习情况—整数二分

2024.6.2练习情况—整数二分 一、例题Acwing789.数的范围 题目 代码 #include<iostream> #include<cstring> using namespace std; const int N 100100; int n,q,k;//题中变量 int arr[N]; //找左端点 void querryleft(int arr[],int k){ int l0,rn-1; …

list~模拟实现

目录 list的介绍及使用 list的底层结构 节点类的实现 list的实现 构造函数 拷贝构造 方法一&#xff1a;方法二&#xff1a; 析构函数 赋值重载 insert / erase push_/pop_(尾插/尾删/头插/头删) begin和end&#xff08;在已建立迭代器的基础上&#xff09; 迭代…

React@16.x(17)Portals

目录 1&#xff0c;使用2&#xff0c;事件冒泡 一句话总结&#xff1a;和 Vue3 的 Teleport 一个效果。 1&#xff0c;使用 import React, { PureComponent } from "react"; import ReactDOM from "react-dom";// 返回一个 React 元素&#xff08;ReactNo…

基于Cortex的MCU设计

基于Cortex的MCU设计 今日更新的存货文档&#xff0c;发现日更文章还是很花时间的。保证一周更新三篇文章就行啦&#xff0c;本篇文章的内容起始主要取自于《Cortex-M3 权威指南》和知网下载的论文。写的不详细&#xff0c;想进一步了解的就去看这篇文档或网上找别的资料&#…

爬虫利器Frida RPC入门——夜神模拟器环境篇

Frida是一款轻量级HOOK框架&#xff0c;可用于多平台上&#xff0c;例如android、windows、ios等。 frida分为两部分&#xff0c;服务端运行在目标机上&#xff0c;通过注入进程的方式来实现劫持应用函数&#xff0c;另一部分运行在系统机器上。frida上层接口支持js、python、…