java jhat_java命令--jhat命令使用

2023-11-13

jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

使用jmap等方法生成java的堆文件后,使用其进行分析。

第一步:导出堆

#jmap -dump:live,file=a.log pid

除了使用jmap命令,还可以通过以下方式:

1、使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件)、

2、虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储。

3、使用 hprof 命令

第二步:分析堆文件

#jhat -J-Xmx512M a1.log

说明:有时dump出来的堆很大,在启动时会报堆空间不足的错误,可加参数:jhat -J-Xmx512m 。这个内存大小可根据自己电脑进行设置。

解析Java堆转储文件,并启动一个 web server

2ef22fd10733cf7799dbcdeddb65bd10.png

第三步:查看html

http://ip:7000/

b746d0e6730e39db1524e0a4dcaaccf1.gif

对于jhat启动后显示的html页面中功能:

(1)显示出堆中所包含的所有的类

8b96980429215e8f803d6ca026d9cefa.gif

(2)从根集能引用到的对象

b72c65f9207651f954875836ea0fbeef.gif

(3)显示平台包括的所有类的实例数量

94154e4be21577d8a0644fc7637560dc.gif

(4)堆实例的分布表

88e07275199a384cebffd390daa5d5f1.gif

(5)执行对象查询语句

9dc0db2ad72cfaeadc3284a0d89835fe.gif

输入内容如:

#查询长度大于100的字符串

select s from java.lang.String s where s.count > 100

详细的OQL可点击上图的“OQL help”

48304ba5e6f9fe08f3fa1abda7d326ab.png

jhat中的OQL(对象查询语言)

如果需要根据某些条件来过滤或查询堆的对象,这是可能的,可以在jhat的html页面中执行OQL,来查询符合条件的对象

基本语法:

select

[from [instanceof] ]

[where ]

解释:

(1)class name是java类的完全限定名,如:java.lang.String, java.util.ArrayList, [C是char数组, [Ljava.io.File是java.io.File[]

(2)类的完全限定名不足以唯一的辨识一个类,因为不同的ClassLoader载入的相同的类,它们在jvm中是不同类型的

(3)instanceof表示也查询某一个类的子类,如果不明确instanceof,则只精确查询class name指定的类

(4)from和where子句都是可选的

(5)java域表示:obj.field_name;java数组表示:array[index]

举例:

(1)查询长度大于100的字符串

select s from java.lang.String s where s.count > 100

(2)查询长度大于256的数组

select a from [I a where a.length > 256

(3)显示匹配某一正则表达式的字符串

select a.value.toString() from java.lang.String s where /java/(s.value.toString())

(4)显示所有文件对象的文件路径

select file.path.value.toString() from java.io.File file

(5)显示所有ClassLoader的类名

select classof(cl).name from instanceof java.lang.ClassLoader cl

(6)通过引用查询对象

select o from instanceof 0xd404d404 o

built-in对象 -- heap

(1)heap.findClass(class name) -- 找到类

select heap.findClass("java.lang.String").superclass

(2)heap.findObject(object id) -- 找到对象

select heap.findObject("0xd404d404")

(3)heap.classes -- 所有类的枚举

select heap.classes

(4)heap.objects -- 所有对象的枚举

select heap.objects("java.lang.String")

(5)heap.finalizables -- 等待垃圾收集的java对象的枚举

(6)heap.livepaths -- 某一对象存活路径

select heaplivepaths(s) from java.lang.String s

(7)heap.roots -- 堆根集的枚举

辨识对象的函数

(1)classof(class name) -- 返回java对象的类对象

select classof(cl).name from instanceof java.lang.ClassLoader cl

(2)identical(object1,object2) -- 返回是否两个对象是同一个实例

select identical(heap.findClass("java.lang.String").name, heap.findClass("java.lang.String").name)

(3)objectid(object) -- 返回对象的id

select objectid(s) from java.lang.String s

(4)reachables -- 返回可从对象可到达的对象

select reachables(p) from java.util.Properties p -- 查询从Properties对象可到达的对象

select reachables(u, "java.net.URL.handler") from java.net.URL u -- 查询从URL对象可到达的对象,但不包括从URL.handler可到达的对象

(5)referrers(object) -- 返回引用某一对象的对象

select referrers(s) from java.lang.String s where s.count > 100

(6)referees(object) -- 返回某一对象引用的对象

select referees(s) from java.lang.String s where s.count > 100

(7)refers(object1,object2) -- 返回是否第一个对象引用第二个对象

select refers(heap.findObject("0xd4d4d4d4"),heap.findObject("0xe4e4e4e4"))

(8)root(object) -- 返回是否对象是根集的成员

select root(heap.findObject("0xd4d4d4d4"))

(9)sizeof(object) -- 返回对象的大小

select sizeof(o) from [I o

(10)toHtml(object) -- 返回对象的html格式

select "" + toHtml(o) + "" from java.lang.Object o

(11)选择多值

select {name:t.name?t.name.toString():"null",thread:t} from instanceof java.lang.Thread t

数组、迭代器等函数

(1)concat(enumeration1,enumeration2) -- 将数组或枚举进行连接

select concat(referrers(p),referrers(p)) from java.util.Properties p

(2)contains(array, expression) -- 数组中元素是否满足某表达式

select p from java.util.Properties where contains(referres(p), "classof(it).name == 'java.lang.Class'")

返回由java.lang.Class引用的java.util.Properties对象

built-in变量

it -- 当前的迭代元素

index -- 当前迭代元素的索引

array -- 被迭代的数组

(3)count(array, expression) -- 满足某一条件的元素的数量

select count(heap.classes(), "/java.io./(it.name)")

(4)filter(array, expression) -- 过滤出满足某一条件的元素

select filter(heap.classes(), "/java.io./(it.name)")

(5)length(array) -- 返回数组长度

select length(heap.classes())

(6)map(array,expression) -- 根据表达式对数组中的元素进行转换映射

select map(heap.classes(),"index + '-->' + toHtml(it)")

(7)max(array,expression) -- 最大值, min(array,expression)

select max(heap.objects("java.lang.String"),"lhs.count>rhs.count")

built-in变量

lhs -- 左边元素

rhs -- 右边元素

(8)sort(array,expression) -- 排序

select sort(heap.objects('[C'),'sizeof(lhs)-sizeof(rhs)')

(9)sum(array,expression) -- 求和

select sum(heap.objects('[C'),'sizeof(it)')

(10)toArray(array) -- 返回数组

(11)unique(array) -- 唯一化数组

48304ba5e6f9fe08f3fa1abda7d326ab.png

参考资料:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java jhat_java命令--jhat命令使用 的相关文章

  • 数据压缩学习实验(四)LZW压缩算法的C++实现及其效率分析

    实验目的 掌握词典编码的基本原理 阅读C语言实现的LZW算法并用C 按自己理解实现LZW解码器并分析编解码算法 以及LZW算法对不同文件的压缩效果 LZW算法原理 关于更具体的图解LZW编解码可以参考 超级简单的数据压缩算法 LZW算法 编
  • ajax获取图片二进制,ajax 请求二进制流 图片

    ajax 请求二进制流图片 var url bootPATH server images 1 png var xhr new XMLHttpRequest xhr open GET url true xhr responseType blo
  • 人脸关键点检测和头部姿态估计数据集生成

    接上篇 人脸关键点检测和头部姿态估计数据集整理 1 借助于OpenPose生成人脸关键点和头部姿态 使用链接 https github com TadasBaltrusaitis OpenFace wiki Command line arg
  • 小白都能看懂 XAMPP的下载安装配置详细教程(含拒绝访问坑)

    话不相瞒 当初为了在XAMPP Apache MySQL PHP PERL 里面配置phpwind 我在卸载与安装之间来回了不下10次 但是我的phpwind始终还是安装不成功 我可能是招坑体质 真的很无奈 最终 我放弃了phpwind 废
  • openmv串口打包发送数据

    openmv端 import time from pyb import UART import ustruct uart UART 3 19200 uart init 19200 8 None 1 def send data d globa
  • hadoop搭建及常见问题

    这是本人在完全分布式环境下在Cent OS中配置Hadoop 0 20 203 0时的总结文档 但该文档也适合其他版本的Linux系统和目前各版本的Hadoop Hadoop 0 20之后的版本配置文件hadoop site xml被拆分成
  • 使用Python,OpenCV对图像进行亚像素点检测,并拟合椭圆进行绘制

    这篇博客将介绍如何使用Python OpenCV对图像进行亚像素检测 并对亚像素点进行椭圆拟合绘制 1 效果图 原始图上绘制拟合椭圆 VS 原始图上绘制拟合椭圆及亚像素点绘制随机半径及颜色的圆 VS 灰度图上绘制亚像素点效果图如下 我喜欢的
  • 安装 mysqlclient==1.3.12 报错:OSError: mysql_config not found

    安装 mysqlclient 1 3 12 报错 OSError mysql config not found Collecting mysqlclient 1 3 12 Using cached mysqlclient 1 3 12 ta
  • 【Mo 人工智能技术博客】时间序列预测——DA-RNN模型

    时间序列预测 DA RNN模型 作者 梅昊铭 1 背景介绍 传统的用于时间序列预测的非线性自回归模型 NRAX 很难捕捉到一段较长的时间内的数据间的时间相关性并选择相应的驱动数据来进行预测 本文将介绍一种基于 Seq2Seq 模型 Enco
  • 在centos7安装anaconda3操作手册

    一 Anaconda下载 进入anaconda官方网站下载个人免费版本 网站链接 点击download 选择Linux平台的安装包 二 Anaconda安装 1 执行如下指令 安装anaconda 进入当保存文件的目录 执行此指令 后期由于
  • Jina AI‘2021

    2022 农历新年进入倒数阶段 回望 2021 因为有了社区和开发者们的支持和助力 Jina AI 从产品 社区 到用户案例及团队 都取得了一些相当哇塞的成就 接下来 我们就一起来重温一下 2021 年 Jina AI 的惊喜变化 领取 J
  • 第十一天栈与队列

    20 有效的括号 力扣题目链接 opens new window 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 题外话 括号匹
  • opencv项目实践一(答题卡识别)

    答题卡素材图片 思路 读入图片 做一些预处理工作 进行轮廓检测 然后找到该图片最大的轮廓 就是答题卡部分 进行透视变换 以去除除答题卡外的多于部分 并且可以对答题卡进行校正 再次检测轮廓 定位每个选项 对选项圆圈先按照竖坐标排序 再按照行坐
  • 十进制有符号小数转换成二进制数的实现_Matlab实现_归一化处理

    在一些数据处理过程中 需要将一组十进制小数转换成二进制数存储或者计算 这种操作在FPGA的使用中会经常遇到 本文分析了十进制小数转换成二进制数的方法 1 N位二进制数的取值范围 N位无符号型 unsigned 取值范围 2 N 1 0 可以
  • Java中守护线程的总结 thread.setDaemon(true)

    https www cnblogs com ziq711 p 8228255 html 在Java中有两类线程 User Thread 用户线程 Daemon Thread 守护线程 用个比较通俗的比如 任何一个守护线程都是整个JVM中所有
  • 服务器windows系统数据盘不显示不出来,解决云主机没有显示数据盘的问题

    随着网络的发展 越来越多的站长与企业都在使用云主机 但是目前由于云主机的尚未成熟 所有大家在使用过程中经常会遇到使用方面的问题 下面我们总结了下有关云主机重装或者初建时数据盘不见的问题做了解说 希望对大家有所帮助 经常会有用户询问 我们的云
  • R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

    最近我们被客户要求撰写关于卷积神经网络的研究报告 包括一些图形和统计输出 在本文中 我们将学习如何使用keras 用手写数字图像数据集 即MNIST 进行深度学习 本文的目的是为了让大家亲身体验并熟悉培训课程中的神经网络部分 1 软件包的下
  • Vue-cli安装文档及使用(搭建vue-cli、nodejs、webpack架子)

    之前学习基础语法 todolist 所有的代码写在index html之中 大型项目不可维护 在真实vue项目开发过程中 会借助webpack打包工具帮助构建大型项目开发目录 再开发完成之后进行打包的操作 帮助生成线上可运行的代码 如果让每

随机推荐

  • 树莓派教程 - 1.5 树莓派GPIO库wiringPi 使用硬件串口ttyAMA0与ttyS0

    Git例程源码仓库 https github com ZhiliangMa raspberry git 上一篇介绍 ttyS0串口的用法 说到了此串口利弊 可能会出现乱码 但绝对能满足绝大部分的要求 本节使用 dev ttyAMA0 的方法
  • CentOS7 安装配置FTP服务器的问题

    C C 气象数据中心实战工业级项目系列 第三章 CentOS7 安装配置FTP服务器的问题 文章目录 C C 气象数据中心实战工业级项目系列 一 参考 二 设置 data ftp ftpuser upload目录 代表着只能在这个目录中上传
  • mysql in和exists性能比较和使用

    in 是把外表和内表作hash 连接 而exists是对外表作loop循环 每次loop循环再对内表进行查询 一直以来认为exists比in效率高的说法是不准确的 如果查询的两个表大小相当 那么用in和exists差别不大 如果两个表中一个
  • 【Redis入门】-浅谈redis事务

    说到事务大家都不陌生 在关系型数据库中 事务时并发控制的基本单位 他是一个操作的序列 可以包含多个指令 并且 对于一个事务 其内部的指令要么全部执行 要么都不执行 内部指令不可分割 关系型数据库的事务具有四个特性 1 原子性 2 一致性 3
  • 【大数据】Flink 详解(六):源码篇 Ⅰ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • 如何解决主机发送地址之后 从机没有发出ACK应答信号给主机

    1 iic总线从机没有返回应答给主机 我用的一个带有iic接口电量计和我的单片机通讯 我用逻辑分析仪分析数据发现主机写一个字节数据后从机并没有返回一个ack给主机 导致我后面读取从机的数据时全部是ff 请问各位iic大神 我该怎么去查问题呢
  • 给kali的Metasploit下添加一个新的exploit

    转载 https blog csdn net SilverMagic article details 40978081 首先在 usr share metasploit framework modules exploits 目录下新建一个自
  • SpringCloud01:认识微服务

    SpringCloud01 1 认识微服务 随着互联网行业的发展 对服务的要求也越来越高 服务架构也从单体架构逐渐演变为现在流行的微服务架构 这些架构之间有怎样的差别呢 1 0 学习目标 了解微服务架构的优缺点 1 1 单体架构 单体架构
  • 从服务器拿文件,怎么从远程服务器拿文件夹

    怎么从远程服务器拿文件夹 内容精选 换一换 添加节点时提示 添加节点失败 节点已存在 待添加节点的服务器上已安装系统性能分析或者添加过节点 如果待添加节点的服务器上已安装系统性能分析 需要登录服务器卸载系统性能分析 详细步骤请参见卸载 卸载
  • [一步一步学react系列] 04—计算器Demo

    前言 之前的例子都是写的计数器 加一减一的功能 我们大致弄懂了redux分层和store数据管理 下面我们将结合现有知识写一个终极版的计算器 以此巩固所学知识 知识点 redux分层 react router 一些算法及数据结构知识 栈 中
  • 调用ChatGpt openai官方node.js包Error: connect ETIMEDOUT问题

    原因是调用的axios库不走系统代理 需要额外配置 openai在文档中有说明增加axios配置的方法 只需请求时配置下proxy就ok了
  • Understand(代码分析工具)的安装教程

    前言 最近在学习嵌入式系统时 写的代码越来越多 一个文件里面函数的数量也越来越多 为方便查看写了哪些函数 以及文件总体架构 在网上找了半天 找到了Understand这款神器 相比于vscode 该软件占内较少 查看结构更直接 文章目录 前
  • JavaScript 获取数组的最后一个元素

    index取值 args args length 1 pop方法 args pop 注意 pop方法会删除args最后一个元素 并返回
  • RS485、MODBUS通信协议浅显易懂篇

    前言 MODBUS协议是Modicon公司发表的一种串行通信协议 属于OSI模型中应用层的协议 现广泛应用于工业控制领域 它的主要特点是免费开放 支持多种电气接口 如RS 232 RS 485 传输介质可以是双绞线 光纤 无线等 RS485
  • 计算机网络基础概论

    什么是Internet 从具体构成角度看 端系统 主机节点 主机及其上运行的网络应用程序 和网络交换设备 数据交换节点 中继器 路由器 交换机 负载均衡设备等 边 通信链路 分为接入网链路和骨干链路 接入网链路是指主机连接到互联网的链路 骨
  • java开发异常类型汇总

    1 java lang nullpointerexception 这个异常大家肯定都经常遇到 异常的解释是 程序遇上了空指针 简单地说就是调用了未经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中 比如图片未经
  • Java 5-1、用户模块-Mybatis代码生成

    5 1 用户模块 Mybatis代码生成 从这里开始 环境相关配置就告一段落了 项目就开始进入开发学习阶段 一 代码生成 实体类 Mapper接口 Mapper xml 分别生成 AppUser java SysUser java 再抽取B
  • Python题目:学生信息管理系统-高级版(图形界面+MySQL数据库)

    Python题目 学生信息管理系统 高级版 图形界面 MySQL数据库 使用图形界面显示 选用list tuple dictionary或map等数据结构 操作数据库存储X个学生的三门课的成绩 机器学习 Python程序设计 研究生英语 并
  • #BDA#笔记#阶段一:熟悉要分析的数据

    学习参考 1 小灶能力派 BDA证书班
  • java jhat_java命令--jhat命令使用

    jhat也是jdk内置的工具之一 主要是用来分析java堆的命令 可以将堆中的对象以html的形式显示出来 包括对象的数量 大小等等 并支持对象查询语言 使用jmap等方法生成java的堆文件后 使用其进行分析 第一步 导出堆 jmap d