jvm 内存镜像_镜像镜像–使用反射在运行时查看JVM内部

jvm 内存镜像

开发人员:Takipi会告诉您何时新代码在生产中中断– 了解更多

我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射。 它是Java和Scala编程的主要方面,它使我们使用的库可以与我们的代码进行交互,而无需对其进行硬编码的知识。 但是我们对反射的使用仅限于在JVM中运行的Java和Scala代码。 如果我们可以使用反射不仅在运行时查看我们的代码,而且还查看JVM的代码怎么办? Java反射

当我们开始构建Takipi时 ,我们寻求一种有效地分析JVM堆内存以启用一些低级优化的方法,例如扫描托管堆块的地址空间。 我们遇到了许多有趣的工具和功能来检查JVM状态的各个方面,其中之一就是这样做的。

它是Java最强大,最底层的调试工具之一-Java Serviceability Agent 。 HotSpot JDK附带了这个功能强大的工具,使我们不仅可以查看堆中的Java对象,还可以查看组成JVM本身的内部C ++对象,这才是真正的魔力所在。

反射成分 。 当处理任何形式的反射以在运行时动态检查和修改对象时,需要两个基本要素。 第一个是要检查的对象的引用(或地址)。 第二个是对对象结构的描述,其中包括对象字段所在的偏移量及其类型信息。 如果支持动态方法调用,则该结构还将包含对类的方法表(例如vtable)的引用以及每个人期望的参数。

Java反射本身非常简单。 您将获得对目标对象的引用,就像对其他对象一样。 通过通用Object.getClass方法(最初从类的字节码加载)可以使用其字段和方法结构。 真正的问题是您如何反映JVM本身?

城堡的钥匙 。 足够令人惊奇的是,JVM通过一组公开导出的符号公开了其内部类型系统。 这些符号为Serviceability代理(或与此有关的任何其他代理)提供对内部JVM类系统的结构和地址的访问权限。 通过这些,可以检查最低级别的JVM内部工作的几乎所有方面,包括诸如原始堆地址,线程/堆栈地址和内部编译器状态之类的内容。

在行动中反思 。 为了了解各种可能性,您可以通过启动Serviceability Agent的HotSpot Debugger UI来查看其中的一些功能。 您可以通过使用sun.jvm.hotspot.HSDB作为主类参数启动sa-jdi.jar来完成此操作。 您将看到的功能与帮助支持JVM最强大的调试工具(例如jmap,jinfo和jstack)的功能相同。

汇丰银行

HSDB和它提供给目标JVM的某些极低级别的检查功能。

怎么做的 。 让我们仔细研究一下JVM如何实际提供这些功能。 这种方法的基础是由jvm库公开导出的gHotSpotVMStructs结构。 该结构公开了内部JVM类型系统以及我们可以从中开始反映的根对象的地址。 可以像通过JNI或JNA与任何公开导出的OS库符号动态链接一样访问该符号。

然后,问题就变成了如何解析gHotSpotVMStructs符号公开的地址中的数据? 如下表所示,JVM不仅公开其类型系统的地址和根地址,还公开了其他符号和值,这些符号和值为您提供了解析数据所需的值。 这些包括类描述符和类类中每个字段所在的二进制偏移量。

依赖行者

* jvm.dll暴露的符号的依赖项遍历屏幕截图

清单gHotSpotVMStructs结构指向类及其字段的列表。 每个类都提供一个字段列表。 对于每个字段,结构都提供其名称,类型以及其静态字段还是非静态字段。 如果它是静态字段,则该结构还将提供对其值的访问。 在静态对象类型字段的情况下,该结构将提供目标对象的地址。 此地址是一个根,我们可以从中开始反映内部JVM系统的特定组件。 这包括诸如编译器,线程或收集的堆系统之类的东西。

您可以在此处检出Serviceability代理用来解析Hotspot JDK代码中的结构的实际算法。

实际例子 。 现在,我们对这些功能可以做什么有了一个广泛的了解,让我们看一下此接口公开的数据类型的一些具体示例。 构建SA代理的人员在围绕gHotSpotVMStructs表提供的大多数类创建Java包装程序时遇到了很多麻烦。 它们提供了一种非常干净和简单的API,以既安全类型又隐藏访问和解析数据所需的大多数二进制工作的方式访问内部系统的大部分。

为了让您大致了解此API提供的一些强大功能,以下是对它提供的低级类的一些引用-

VM是单例类,它公开了许多JVM的内部系统,例如线程系统,内存管理和收集功能。 它是许多JVM子系统的切入点,并且是探索此API的良好起点。

JavaThread让您从内部了解JVM如何从内部看到Java线程,并深入了解框架位置和类型(编译,解释,本机…)以及实际本机堆栈和CPU寄存器信息。

CollectedHeap使您可以浏览收集到的堆的原始内容。 由于HotSpot包含多个GC实现,因此这是一个抽象类,具体的实现(例如ParallelScavengeHeap)从该抽象类继承。 每个提供一组内存区域,其中包含Java对象所在的实际地址。

当您查看每个类的实现时,您会发现它实际上只是一个硬编码包装器,使用类似于反射的API来查看JVM的内存。

C ++中的反射 。 这些Java包装器中的每一个都被设计为JVM中内部C ++类的几乎完整的镜像。 众所周知,C ++没有本机反射功能,这引发了如何创建该桥的问题。

答案在于JVM开发人员所做的非常独特的事情。 通过一系列C ++宏和大量艰苦的工作,HotSpot团队手动将数十个内部C ++类的字段结构映射并加载到全局gHotSpotVMStructs中。 这个过程使它们可用于从外部反射。 实际的字段偏移量值和布局是在JVM编译时生成的,有助于确保导出的结构与JVM的目标OS兼容。

进程外连接 。 Serviceability代理还有一个更强大的方面值得一看。 SA框架提供的最酷的功能之一是能够从进程外反映外部实时JVM。 这是通过将Serviceability代理作为操作系统级别的调试器附加到目标JVM来完成的。 由于这取决于操作系统,因此对于Linux,SA代理框架将利用gdb调试器连接。 对于Windows,它将使用winDbg(这意味着将需要Windows调试工具)。 调试器框架是可扩展的,这意味着可以通过扩展抽象DebuggerBase类来使用另一调试器 。

建立调试器连接后,会将gHotSpotVMStruct的返回地址值传递回调试器进程,该进程可以(借助OS)开始检查甚至修改目标JVM的内部对象系统。 HSDB正是通过这种方式,您可以连接和调试目标JVM(包括Java和JVM代码)。

HSDB接口

* HSDB的界面公开了SA代理反映目标JVM进程的能力

我希望这引起了您的兴趣。 从我个人的角度来看,该体系结构是我最喜欢的JVM之一。 在我看来,它的优雅和开放绝对令人赞叹。 当我们构建Takipi的一些实时编码部分时,这对我们也非常有帮助,因此对于设计它的优秀人员来说,这是一个很大的窍门。

参考: Mirror Mirror –来自Takipi博客的JCG合作伙伴 Tal Weiss在运行时使用反射在JVM内部进行查看 。

翻译自: https://www.javacodegeeks.com/2014/01/mirror-mirror-using-reflection-to-look-inside-the-jvm-at-run-time.html

jvm 内存镜像

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

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

相关文章

谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!

有没有想过圣诞老人如何为世界各地的孩子们送上节日礼物? 有20亿个孩子,每个孩子都有自己的愿望清单,他会在24小时内完成。 这意味着每个孩子平均需要43微秒,他需要检查每个孩子是否顽皮或好。 您无需再怀疑了。 我会透露这个秘密…

php时间格式函数,PHP函数之日期时间函数date()使用详解_php基础_脚本

$ttime();echo date("Y-m-d H:i:s",$t);第一个参数的格式分别表示:a - "am" 或是 "pm"A - "AM" 或是 "PM"d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31"D - 星期几…

play框架配置 拦截器_如何使用Play框架为https配置SSL证书

play框架配置 拦截器我花了几个小时试图使它起作用,最后,问题是我自己没有使用keytool生成CSR(证书请求)。 当我尝试通过https访问Play时,我一直收到此错误: javax.net.ssl.SSLPeerUnverifiedException&a…

matlab 球坐标绘图,MATLAB绘制地图

1使用向量绘制地图1.1绘制全球海岸线向量数据可以表示一个地图。这种向量存在的形式是一系列的经纬度或投影坐标对,它们代表一个点集、一个线条或者多边形。例如,描绘出行政区域边界的点、公路系统、城市的中心或者以上三个集合放在一起,都可…

php 有 stringbuffer,String、StringBuffer、StringBulider三者介绍

三者都实现了CharSequence接口,因此CharSequence可认为是一个字符串的协议接口1.String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁;我们常常定义的时候 S…

php生成网页按钮,JavaScript实现自动生成网页元素功能(按钮、文本等)_javascript技巧...

创建元素的方法:1、利用createTextNode()创建一个文本对象2、利用createElement()创建一个标签对象3、直接利用容器标签中的一个属性:innerHTML-----本质上改该标签容器中的“html代码”,不是我们认为的对象树的操作详解代码:这是…

adf 自动输稿器_在ADF实体PK属性中使用MySQL自动增量PK列

adf 自动输稿器大家好。 继续进行ADF MySQL解决方法系列,今天我们将看到需要做些什么才能将MySQL PK自动增量列与ADF实体PK属性一起使用。 如果使用的是Oracle数据库,则可以使用oracle.jbo.domain.DBSequence以及序列和触发器来立即进行操作。 为简单起…

探索适用于Apache Spark的Spline Data Tracker和可视化工具(第1部分)

最近引起我注意的一个有趣且充满希望的开源项目是Spline ,它是由Absa维护的Apache Spark的数据沿袭跟踪和可视化工具。 该项目由两部分组成:一个在驱动程序上工作的Scala库,该驱动程序通过分析Spark执行计划来捕获数据沿袭,并提供…

高性能mysql 聚簇索引,高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引...

一、聚集索引介绍1.什么是聚集索引?InnoDB’s clustered indexes actually store a B-Tree index and the rows together in the same structure.2.为什么一张表只能一个聚集索引?When a table has a clustered index, its rows are actually stored in …

PHP应用GD2函数填充几何图形,使用GD2函数绘制几何图形(PHP图形图像的典型应用教程4)...

使用GD2函数绘制几何图形(PHP图形图像的典型应用教程4)本篇主要讲解使用GD2函数实现几何图形的绘制,首先我们需要的事创建一个图像,在之前的文章中我们就说过了,创建图像是所有图像操作的第一步,然后再背景上根据坐标点绘制图形轮…

API测试和自动化101:基本指南

API代表A pplication P AGC软件我覆盖整个院落。 通常,API用于通过使用任何通信方式来促进两个不同应用程序之间的交互。 在网络上使用API​​时,我们将其称为“ Web服务”。 最近,API已成为编程的Struts。 与在应用程序中一样,编…

oracle数据库安装HotSpot,安装Oracle数据库软件遭遇诡异的HotSpot Virtual Machine Error : 11报错...

虽然也装了很多次的数据库了,可是偶尔还是会碰见一些很无语的错误,前两天在RHEL5.0上安装Oracle 10g 10.2.0.1,起图形后点击下虽然也装了很多次的数据库了,可是偶尔还是会碰见一些很无语的错误,前两天在RHEL5.0上安装O…

linux结束所有任务命令行,Linux基础命令(15)定时任务

释放双眼,带上耳机,听听看~!crontadLinux定时任务Crontab命令详解linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设…

如何修复无效的目标版本:Maven Build中的1.7、1.8、1.9或1.10错误

如果您正在使用Maven构建Java项目,可能是在Eclipse中,或者是通过运行mvn install在命令提示符下构建的,并且构建失败并显示诸如“无效的目标发行版:1.7”或“无效的目标发行版:1.8”之类的错误,那么您来了到…

Linux查看时间段文件,Linux查看特定时间段内修改过的文件

一.Linux系统日志的一些信息,日志配置文件syslog.conf系统日志一般都存在/var/log下常用的系统日志如下:核心启动日志:/var/log/dmesg系统报错日志:/var/log/messages邮件系统日志:/var/log/maillogFTP系统日志:/var/log/xferlog安全信息和系统登录与网络连接的信息…

使用ClickHouse UDF与OpenAI模型集成

本文字数:14683;估计阅读时间:37 分钟 作者:Dale McDiarmid 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 Meetup活动 ClickHouse Shenzhen User Group第1届 Meetup 火热报名中&#x…

使用Spring Boot和Vue.js构建一个简单的CRUD应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 在本教程中,您将使用Vue.js作为客户端并将Spring Boot作为资源服务器来构…

linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)

在下载目录下解压heqinheqin-dell:~/Downloads$ tar zxvf parallel_studio_xe_2017_update7.tgz进入解压后的文件夹heqinheqin-dell:~/Downloads$ cd parallel_studio_xe_2017_update7/为了记录过程而不用截图,我选择用命令行安装,当然你也可以用install…

linux 安装mongodb 64,在CentOS 6.x 64bit上安装MongoDB 3.2社区版

基本安装步骤参考: https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/1) 创建repo源文件:sudo vim /etc/yum.repos.d/mongodb-org-3.2.repo内容如下:[mongodb-org-3.2]nameMongoDB Repositorybaseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mon…

[免费网络研讨会] Java 11的第一印象

一年多以前,我们正焦急地等待新的模块化Java 9的到来。大约在同一时间,引入了一个新的发布周期,该周期将每6个月发布一次新版本,并提供长期支持(LTS)。每3年发行一次(或每6个版本发行一次&#…