镜像镜像–使用反射在运行时查看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提高工作效率…

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

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

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

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

WPF中元素拖拽的两个实例

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

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

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

搭建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…

sqlalchemy mysql_使用SQLAlchemy操作MySQL

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

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

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

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

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

js页面加载前执行_做一名合格的前端开发工程师:Javascript加载执行问题探索

做前端开发少不了各种利器。比如我习惯用的还是Google浏览器和重型武器Fiddller。一:原始情况 首先大家看看如下的代码:估计90%的程序员都会把js文件放在head中,但是大家有没有深究过呢?很多浏览器都会使用单一的线程来做“界面UI…

【线性代数】3-5:独立性,基和维度(Independence,Basis and Dimension)

title: 【线性代数】3-5:独立性,基和维度(Independence,Basis and Dimension) categories: MathematicLinear Algebra keywords:IndependenceBasisDimensionSpan toc: true date: 2017-09-25 15:20:46Abstract: 本文是本章最重要的知识点,也是整个线性代…

APP网络测试要点和弱网模拟

当前APP网络环境比较复杂,网络制式有2G、3G、4G网络,还有越来越多的公共Wi-Fi。不同的网络环境和网络制式的差异,都会对用户使用app造成一定影响。另外,当前app使用场景多变,如进地铁、上公交、进电梯等,使…

word公式插件_再也不用担心我的公式写不出来了:一款公式输入神器实测

→ → https://mp.weixin.qq.com/s/gNRWdN-W4_Eb2MyyTpWzjw关注微信公众号:人工智能前沿讲习,重磅干货,第一时间送达本文推荐一个公式输入神器,只要截图就能识别公式,手写的公式都能识别。经过实测,几乎没有…

使用Camel在Amazon上构建分布式工作流应用程序

带有SNS-SQS的管道 工作流由按动态条件确定的特定顺序执行的独立任务组成。 工作流通常代表业务流程,例如电子商务商店中的订单处理步骤。 Amazon Web Services提供了各种工具来构建分布式和可扩展的工作流应用程序。 构建此类应用程序的一种方法是使用主题和队列来…

mysql 高版本检索外键_第05期:外键到底能不能用?

外键的设计初衷是为了在数据库端保证对逻辑上相关联的表数据在操作上的一致性与完整性。外键在大部分企业写的开发规范里会直接规避掉!外键有优缺点,也并不是说每种场景都不适用,完全没有必要一刀切。外键到底能不能用?下面会针对…

从Ant Build演进Gradle Build:导入Ant Build文件

在大型项目上更改构建系统可能很困难并且需要大量工作。 幸运的是,对于那些将Ant版本迁移到Gradle版本的人,Gradle提供了特别方便的机制来促进这种迁移 。 由于Gradle基于Groovy构建,并且Groovy通过AntBuilder包含内置的Ant支持,因…

HTML5 之 简单汇总

参考: HTML5的十大新特性 前端面试必备之html5的新特性 HTML5 主要内容:语义化、增强型表单、多媒体标签、Canvas、SVG、地理定位、拖放API、Web Worker、Web Storage、WebSocket、HTML 5 应用程序缓存 1.语义化元素 1.1结构元素 标签描述article表示与上…

个人信息管理系统代码_Thymeleaf+SpringBoot+Mybatis实现的易游网旅游信息管理系统...

项目简介项目源码:麻烦转发后关注JAVA梦想口服液私信回复【源码】即可获取!本系统是基于ThymeleafSpringBootMybatis。是非常标准的SSM三大框架(SpringBoot就是一个大框架,里面包含了许多的东西,其中Spring就是最核心的内容&#…

被问到有没有内核开发经验_一个人就是一个开发团队!成电硬核毕业生自制迷你电脑走红!...

△小视频近日,一段长3分多钟的小视频在B站突然爆红,不仅登上首页,获得超过200万的播放量,还被众多观众“膜拜”。有网友在评论区说:“其实这些东西吧,外行看起来很牛,但我这种内行看起来&#x…