在运行期通过反射了解jvm内部机制-java开发java经验技巧

在运行期通过反射了解jvm内部机制-java开发java经验技巧

ID:30892052

大小:76.50 KB

页数:5页

时间:2019-01-04

在运行期通过反射了解jvm内部机制-java开发java经验技巧_第1页
在运行期通过反射了解jvm内部机制-java开发java经验技巧_第2页
在运行期通过反射了解jvm内部机制-java开发java经验技巧_第3页
在运行期通过反射了解jvm内部机制-java开发java经验技巧_第4页
在运行期通过反射了解jvm内部机制-java开发java经验技巧_第5页
资源描述:

《在运行期通过反射了解jvm内部机制-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、在运行期通过反射了解JVM内部机制-Java开发Java经验技巧在运行期通过反射了解JVM内部机制木文由ImportNew・黄飞飞翻译自takipioncodeo欢迎加入翻译小组。转载请见文末要求。在F1常工作中,我们都习惯直接使用或者通过框架使用反射。在没冇反射相关硬编码知识的情况卜,这是Java和Scala编程中使用的类库与我们的代码Z间进行交互的一种主要手段。但是,使用反射仅限于JVM内部运行的Java和Scala代码。假使在运行期通过反射既能查看自己的代码乂能看到JVM的代码,会有怎样的效果呢?当我们开始创建Takipi的时候,试图寻找一种通过分析JVM堆内存来进

2、行一些底层优化的有效方法,比如扫描一个托管堆块(managedheapblock)的地址空间。我们找到了许多有趣的工具和组件用来检测JVM状态的各个方面,具屮一个就是在运行期通过反射了解JVM内部机制。译注:Takipi是一家以色列创业公司,发现了一种构建后端服务器网络的新方式,可以使用非常简化的除错流程帮助企业定位错误。Java可服务性代理(Scrviccablity?Agcnt,简写SA)是最强大和最底层的Java调试工具Z-o这个强大的工具是HotSpot?JDK自带的。使用它不仅可以看到堆中的Java对象,还可以看到内部C++?对彖,包押iJVM本身。那才是真正魔

3、法开始的地方。反射的构成:在运行时动态检测和修改对象时,无论使用何种形式的反射都不能缺少两个必要信息。第一个是想耍检测的对彖引用(或者地址);第二个是对象结构描述,包括所有字段的偏移量以及它们的类型信息。如果支持动态方法调用,这个结构还需要包括类方法表(比如?vtable)的引用,以及每个方法需要的参数。Java反射本身是非常简单的,通过反射获取目标对象的引用与获取其它方式一样。使用Object.getClass?通用方法(最开始从类的字节码中加载)获取字段和方法结构。真正的问题是:如何反射JVM本身?反射的关键:令人惊奇的是,JVM通过一套公开的输出符号暴露了其内部的类

4、型系统。?这些符号给可服务性代理(或其他工具)提供了访问JVM内部类系统结构和地址的方法。通过这些符号,几乎可以检测到JVM内部在最底层运行机制的所有方面,包括诸如原始堆地址、线程/栈地址以及编译器内部状态等。反射实战:为了增加对这种方式的了解,启动可服务性代理的HotSpot调试程序界面,可以看到止在运行的一些功能。将sun.jvm.hotspot.HSDB作为主类参数启动sa-jdi.jar,可以看到与其它JVM功能强大调试工具,例如?jmap、jinfo?和?jstack等,一样的底层信息。HSDB及其为目标JVM提供的一些非常底层的检测功能具体实现:让我们仔细了解

5、这些出JV"提供的功能。这种方法的基础是由?jvm函数库公开导出的gllotSpotVMStructs?结构。这个结构暴露了JVM内部的类型系统,也为我们捉供了可以开始反射的根对彖地址。可以通过?JN1?或者?JNA访问这个符号,调用方式与访问动态链接的操作系统公开系统库符号一样。接下来问题就变成:怎样解析由?gHotSpotVMStructs符号小地址的数据?从下表中可以看到,JVM不仅暴露了类型系统的地址以及根对象地址,还提供一些额外的符号用來解析需要的数据值。这些数据包括已定位的类描述符及其二进制偏移量。jvm.dl1暴露符号的一个dependencywalker截

6、图清单(manifest):gHotSpotVMStructs结构指向了类及其字段的一个列表,每个类提供了一个字段列表。对于每个字段,该结构提供了它的名称、类型以及是否静态字段。如果是一个静态字段,这个结构述会捉供目标对象的访问地址。该地址可用作反射JVM内部特定组件的根,包括诸如编译器、线程处理或者收集堆系统等。可以从这里检出Hotspot?JDK中可服务性代理用來解析?gHotSpotVMStructs的实际算法。实例:既然已经大概了解了这些功能,现在看一些由该接口访问数据类型的示例。那些编写SA代理的人,在为gHotSpotVMStructs表中的类创建Java封装

7、时克服了很多麻烦。在访问大多数内部系统时,这些封装提供一套简洁的API,不仅类型安全而且还隐藏了一些解析数据所必须的二进制工作。为了更好地了解这些API提供的强大功能,卜•面是其中的一些底层类介绍:•VM?是一个单例类,它暴露了JVM的许多内部系统,比如线程系统、内存管理以及集合功能。可以把它当作JVM许多了系统的一个入口。当你研究API时,町以从这里入手。•JavaThread?可以让你从JVM角度理解一个Java线程,?同时还有(编译后的、经过解释的和本地)帧位直和类型的深入信息以及实际的本地堆栈和CPU寄存器信息。•Co

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。