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() {
            @Override
            public 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() {
            @Override
            public 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;
    @Override
    public 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.mfbz.cn/a/676098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang TCP网络编程

文章目录 网络编程介绍TCP网络编程服务器监听客户端连接服务器服务端获取连接向连接中写入数据从连接中读取数据关闭连接/监听器 简易的TCP回声服务器效果展示服务端处理逻辑客户端处理逻辑 网络编程介绍 网络编程介绍 网络编程是指通过计算机网络实现程序间通信的一种编程技术…

成功解决“ModuleNotFoundError: No Module Named ‘utils’”错误的全面指南

成功解决“ModuleNotFoundError: No Module Named ‘utils’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No Module Named utils这样的错误通常意味着Python解释器无法找到名为utils的模块。这可能是由于多种原因造成的&#xff0c;比如模块确实不存…

推荐一款开源Scada,数据采集必备

软件介绍 PySCADA的核心是一个基于HTML5的HMI&#xff0c;不仅确保现代性&#xff0c;还确保与各种设备的无缝集成。该框架通过提供对广泛工业协议的支持&#xff0c;进一步巩固其功能。这些包括Modbus TCP/IP、RTU、ASCII和Binary&#xff0c;让用户可以轻松地与不同的设备和系…

党历史纪念馆3d沉浸式虚拟展厅为参观者提供了一个身临其境的革命教育世界

传统的展览方式虽然能够传达一定的信息&#xff0c;但往往难以激发参观者的深度参与和共鸣。而廉政教育VR数字化展厅通过VR虚拟现实技术的运用&#xff0c;打破了传统展览的局限性&#xff0c;为参观者提供了一个身临其境的廉政世界。 在这个廉政教育VR数字化展厅中&#xff0c…

高中数学:解三角形-大题练习

例题1 解析 第一小问 根据条件等式&#xff0c;我们发现&#xff0c;每一项都含有边&#xff0c;但是&#xff0c;不是每一项都含有角 于是&#xff0c;我们要想到用正弦定理把边换为角来解答该题 第二小问 例题2 解析 第一小问 两个等式条件&#xff0c;各个项都含有边&…

代码随想录算法训练营第十三天|239. 滑动窗口最大值、 347.前 K 个高频元素

239. 滑动窗口最大值 题目链接&#xff1a;滑动窗口最大值 文档讲解&#xff1a;代码随想录 状态&#xff1a;忘了 思路1&#xff1a;使用优先队列来维护滑动窗口中的最大值&#xff0c;确保在每次滑动时能够高效地找到最大值。时间复杂度是 O(n log k)。 题解&#xff1a; cl…

MyBatis的各种查询功能

1、查询&#xff1a; 查询的标签select必须设置属性resultType或resultMap&#xff0c;用于设置实体类和数据库表的映射关系 resultType&#xff1a;自动映射&#xff0c;用于属性名和表中字段名一致的情况 resultMap&#xff1a;自定义映射&#xff0c;用于一对多或多对一或…

每日一练——分糖果2

1103. 分糖果 II - 力扣&#xff08;LeetCode&#xff09; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* distributeCandies(int candies, int num_people, int* returnSize) {int num 0;int* arr (int*)malloc(sizeof(int)*num_peo…

C语言 链表经典OJ题

链表经典OJ题 移除链表元素链表的中间节点反转链表合并两个有序链表分割链表 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head […

贝锐蒲公英异地组网:降低建筑工地远程视频监控成本、简化运维

中联建设集团股份有限公司是一家建筑行业的施工单位&#xff0c;专注于建筑施工&#xff0c;业务涉及市政公用工程施工总承包、水利水电工程施工总承包、公路工程施工总承包、城市园林绿化专业承包等&#xff0c;在全国各地开展有多个建筑项目&#xff0c;并且项目时间周期可能…

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

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

使用Python绘制南丁格尔图(玫瑰图)

使用Python绘制南丁格尔图&#xff08;玫瑰图&#xff09; 南丁格尔图效果代码 南丁格尔图 南丁格尔图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;也被称为玫瑰图或极区图&#xff0c;是一种特殊的圆形统计图&#xff0c;用于显示多个类别的数据。它是由弗洛…

鸿蒙开发接口资源调度:【@ohos.workScheduler (延迟任务调度)】

延迟任务调度 本模块提供延迟任务注册、取消、查询的能力。 开发者在开发应用时&#xff0c;通过调用延迟任务注册接口&#xff0c;注册对实时性要求不高的延迟任务&#xff0c;该任务默认由系统安排&#xff0c;在系统空闲时根据性能、功耗、热等情况进行调度执行。 说明&am…

Linux配置java,maven,marshalsec环境

文章目录 一. Linux配置java环境1.下载jdk文件2.解压tar.gz文件3.设置java环境变量4.验证是否成功 二. Linux配置maven环境1.下载压缩包2.解压tar.gz3. 配置环境变量 三. Linux配置marshalsec环境 一. Linux配置java环境 1.下载jdk文件 mkdir /opt/javawget https://repo.hua…

高通开发系列 - ubuntu中的docker安装debian镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述当前状态Ubuntu中安装dockerDebian镜像Debian容器中操作更改Debian源安装应用程序

VIKOR方法

简介 VIKOR方法是一种多标准决策&#xff08;MCDM&#xff09;或多标准决策分析方法。它最初由 Serafim Opricovic 开发&#xff0c;用于解决具有冲突和不可通约&#xff08;不同单位&#xff09;标准的决策问题&#xff0c;假设冲突解决可以接受妥协&#xff0c;决策者想要一…

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

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

【C++初阶学习】第十二弹——stack和queue的介绍和使用

C语言栈&#xff1a;数据结构——栈(C语言版)-CSDN博客 C语言队列&#xff1a;数据结构——队列&#xff08;C语言版&#xff09;-CSDN博客 前言&#xff1a; 在之前学习C语言的时候&#xff0c;我们已经学习过栈与队列&#xff0c;并学习过如何使用C语言来实现栈与队列&…

sql注入 (运用sqlmap解题)

注:level参数 使用–batch参数可指定payload测试复杂等级。共有五个级别&#xff0c;从1-5&#xff0c;默认值为1。等级越高&#xff0c;测试的payload越复杂&#xff0c;当使用默认等级注入不出来时&#xff0c;可以尝试使用–level来提高测试等级。 --level 参数决定了 sql…

人脸识别技术与人证合一智能闸机的剖析

人脸识别技术&#xff0c;作为一种先进的生物认证手段&#xff0c;依据个体面部独有的特征信息来进行身份验证。这项技术通过捕获图像或视频中的面部数据&#xff0c;执行一系列精密步骤&#xff0c;包括图像获取、面部定位、预处理、特征提取与比对&#xff0c;以确认个人身份…