镜像镜像–使用反射在运行时查看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

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

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

相关文章

UnicodeMath数学公式编码_翻译(Unicode Nearly Plain - Text Encoding of Mathematics Version 3)

目录 完整目录1. 简介2. 编码简单数学表达式2.1 分数2.2 上标和下标2.3 空白(空格)字符使用3. 编码其他数学表达式3.1 分隔符强烈推荐本文简明版UnicodeMath编码教程 本文为UnicodeMath官方文档的翻译,原文看这。翻译如有不准还请谅解&#x…

antd 表格树如何展开_如何分析工作,找出规律,使用excel大幅度提高工作效率...

在职场中,掌握一定的excel知识,有时候可以极大的提高工作效率,减少加班次数。但是有的人可能不知道如何去做,下面我使用一个我前几天遇到的工作场景,一步一步的来给大家展示一下,如何使用excel提高工作效率…

eclipse插件 tcp/iip monitor

http://huangrongyou.iteye.com/blog/1764041 转载于:https://www.cnblogs.com/chyxOne/p/9673784.html

Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)

Wijmo的CompositeChart控件允许您使用一个Chart来分析和展现复杂的数据。相同的数据可以使用不同的可视化效果,不同的图表类型展现在一个图表内,使得用户可以从不同的角度,了解分析这组数据所表达的内容 。 本文将介绍如何使用Wijmo的Composi…

广联达2018模板算量步骤_广联达gtj2021实操案例,新增6大板块,快速提高算量效率...

对于从事造价行业的朋友来说,广联达软件是我们最经常用到的软件,不仅是因为广联达软件能够在提高工作效率,主要还是现在大数据下,广联达软件可以做到更精准、零失误广联达软件更新的也比较快,广联达GTJ2021版已经更新出…

鲜为人知的Java 8功能:广义目标类型推断

遍历Java 8功能列表 &#xff0c; 广义目标类型推断使我震惊&#xff0c;因为它是一个特别有趣&#xff0c;鲜为人知的瑰宝。 看起来Java语言设计人员将减轻过去使用泛型&#xff08;Java 5-7&#xff09;时遇到的某些痛苦。 让我们看看他们的例子&#xff1a; class List<…

谈谈技术原则,技术学习方法,代码阅读及其它

一、选用技术的原则比较规范的软件开发过程要到有限的几个公司才能学到。偶现在所采用的方法都是圡方法&#xff0c;主程序员&#xff0c;测试驱动&#xff0c;文档和代码写在一起&#xff0c;原型。但基本上坚持几个原则&#xff1a;在工作上以实用为主导&#xff0c;哪个实用…

python下载库报错_下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决...

前言最近在网上找了很多下载Crypto的方法&#xff0c;感觉作用都不算很大&#xff0c;然后自己瞎搞瞎搞就搞好了&#x1f605;&#xff0c;所以打算分享出来。直接pip下载或者Anaconda下载&#xff0c;Anaconda的话可以直接在官网上下载&#xff0c;pip就不说了&#xff0c;下载…

WPF中元素拖拽的两个实例

WPF中元素拖拽的两个实例 原文:WPF中元素拖拽的两个实例今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结&#xff0c;这里主要用两个例子来说明在WPF中如何使用拖拽进行操作&#xff0c;元素拖拽是一个常见的操作&#xff0c;第一个拖拽的例子是将ListBox中的子元素…

linux重启mysqlsystemctl_解决linux(centos7)重新安装mysql systemctl start mysqld.service时报错...

重新安装mysql时&#xff0c;运行systemctl status mysqld.service报错。[roottest-dcruxue ~]# systemctl start mysqld.serviceJob for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and &q…

使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务

中断了将近半年后发表了一篇新文章。 在本文中&#xff0c;我们将快速了解如何开始使用vert.x&#xff0c;更有趣的是&#xff0c;如何使用RxJava简化异步系统的编程。 我们将涵盖以下主题&#xff1a; 使用Maven创建一个空的vert.x项目 导入IntelliJ并创建一个简单的HTTP服务…

开发进度2

今天主要的精力都是在学习github的基础知识 包括注册安装以及建立一个Git库&#xff0c; 接下来便是菜鸟教程中对github的初步操作详解 注册账户以及创建仓库 要想使用github第一步当然是注册github账号了&#xff0c; github官网地址&#xff1a;https://github.com/。 配置G…

搭建react native所遇到的坑

一、所遇问题 在搭建react native环境中,遇到执行react native run-android命令出现如下问题 1 Could not resolve all dependencies for configuration :classpath. 2 > Could not resolve com.github.dcendents:android-maven-gradle-plugin:3.1.4 3 Required b…

nginx的ngx_http_realip_module模块和http头X-Forwarded-For、X-Real-IP

ngx_http_realip_module模块 realip模块作用&#xff1a;当本机的nginx处于反向代理的后端时可以获取到用户的真实ip。可以让accesslog记录用户真实IP地址。 set_real_ip_from IP1; real_ip_header X-Forwarded-For; real_ip_recursive on; set_real_ip_from —— 设置反向代…

sqlalchemy mysql_使用SQLAlchemy操作MySQL

SQLAlchemy是Python编程语言下的一款开源软件&#xff0c;提供了SQL工具包及对象关系映射(ORM)工具&#xff0c;使用MIT许可证发行。SQLAlchemy首次发行于2006年2月&#xff0c;并迅速地在Python社区中最广泛使用的ORM工具之一&#xff0c;不亚于Django的ORM框架。本文将介绍如…

使用phpstorm+wamp实现php代码实时调试审计

转载自&#xff1a;https://www.bugbank.cn/q/article/5853afaffc0bf4f010ee6ac3.html php调试有N多好用的工具&#xff0c;最近研究到phpstorm配合wamp实现php实时断点调试相当不错&#xff0c;推荐给大家&#xff0c;网上有各种配置版本&#xff0c;但没有一个能好使的。本文…

python处理字符串数组慢_Python字符串处理 - str/bytes

1. strstr.count(sub[, start[, end]])str.encode(encoding"utf-8", errors"strict")str.format(*args, **kwargs) # s "this is from {}".format(__file__)str.find(sub[, start[, end]]) # 没有查找到子串&#xff0c;返回-1str.rfind(sub[, …

如何使用Play框架为https配置SSL证书

我花了数小时试图使它起作用&#xff0c;最后&#xff0c;问题是我自己没有使用keytool生成CSR&#xff08;证书请求&#xff09;。 尝试通过https访问Play时&#xff0c;我一直收到此错误&#xff1a; javax.net.ssl.SSLPeerUnverifiedException&#xff1a;对等方未通过身份…

ERP行业销售如何挖掘潜在客户?

要看不同阶段&#xff0c;小企业发展到一定程度&#xff0c;第一个需求是单体财务系统。因为这个时候财务忙不过来了。在大一点就需要业务系统了&#xff0c;就是生产进销存。有分公司就有集团级软件需求&#xff0c;接着就是oa啊HR啊上下游管理啊等等。接着把握住成本的节省和…

网络隔离主要技术

网络隔离&#xff1a;把两个或者两个以上可路由的网络&#xff08;如&#xff1a;TCP/IP&#xff09;通过不可路由的协议&#xff08;如&#xff1a;IPX/SPX、NetBEUI等&#xff09; 进行数据交换而达到隔离目的。主要原理是使用了不同的协议&#xff0c;故也叫协议隔离。 网络…