JVM:有些内部新闻吾悄悄通知你

阅读: 作者:admin   发表于 2021-08-05 15:30

  

对于 Java 的逆射行使, 清淡用户都有所晓畅。稀奇是在开源框架里更是大量的行使。经历逆射,吾们能拿到一个Java Class 的新闻。那对于 JVM 的内部新闻,像堆的行使情况、线程、甚至是创建对象的内存地址、添载的类的内容,该怎么办呢?

其实在 JVM内,有很多内部的新闻,比如上面挑到的那些,就相通于生活中的内部新闻相通。你能够想像一些大型行使,一些用户的数据吾们只能经历 API 授权的手段拿到,清淡用户平常行使的时候,是不能够获取到这些内容的。就像做为运走在 JVM 上的清淡 Java行使,也很难拿到 JVM 的新闻,毕竟 JVM 更底层,是C++ 开发的。

JVM 会把这些内部新闻通知咱们吗?

JVM 挑供了一些对外的接口,把它的内部新闻吐露了出来。经历这些接口SA 才得以访问到 JVM 内部类的结议和地址,也才能从底层不益看察到 JVM内部运走的细节。

你望在SA 图形界面的HSDB内部,长长的菜单列外,大多都是经历清淡Java 行使获取不到的「内部新闻」。

这些都是怎么实现的呢?说到这边,就不得不挑 gHotSpotVMStructs。

JVM 给挑供的那些接口,中央是 gHotSpotVMStructs 这个组织。它对外袒露了JVM内部的大量新闻,像原首的堆的地址,线程、栈的地址等等。

gHotSpotVMStructs组织指向了很多类以及这些类的字段新闻。每个类都有一系列的字段,每个字段又有本身的名字,类型,是否静态等等。倘若是静态字段这个组织还能够用来访问它的值。对于一个静态的对象字段,这个组织体还会挑供现在的对象的地址。经历这个根地址吾们能够最先逆查JVM内部的一些组件,包括编译器,线程还有堆。

因而要获取和理解JVM 这些内部新闻的关键,是在如何解析这个gHotSpotVMStructs 组织内里的数据。JVM不光袒露了它的内部类型体系的地址和根对象地址,还有用以解析这些数据的一些额外的符号和值。这包含类描述新闻和每个字段在这个类里的偏移量,此外 JVM开发者又做了一系列的做事,手动把JVM内部的C++类的字段映射并添载到了全局的gHotSpotVMStructs组织里。

SA 就是解析这些新闻最益的例子。经历图形界面吾们能直不益看感受到解析这些新闻晓畅到了什么,经历翻译 gHotSpotVMStructs袒展现的这些新闻,生成Java的包装类。经历这些包装类挑供出来的接口让访问JVM内部体系的做事变的浅易和方便,和清淡的Java 行使行使API 相通,解决了访问休争析内部数据的懊丧。

甚至其它的一些调试工具,诊断工具也是基于这些新闻来实现的。

经历吾们行使SA的手段,其实是经历一个「ptrace」的体系调用,挂首现在的JVM 进程,最先读取 gHotSpotVMStructs 这些内存新闻。

望到上面的内容,吾们大致理解了SA 的做事原理。那你倘若有云云的需要,是不准别人经历 SA 等工具来获取你JVM 的新闻呢?

望,打哪儿指哪儿。应案就是重置gHotSpotVMStructs。云云工具就不克解析出来这些新闻了。

Stackoverflow 上有个解决方案,是编译一个 agent,在启动JVM 的时候挂上往,并将gHotSpotVMStructs 竖立为0。

extern void *gHotSpotVMStructs;  int Agent_OnLoad(void *vm, char *options, void *reserved) {     gHotSpotVMStructs = 0;     return 0; } 

启动的时候,挂接到JVM上。

java -agentpath:/path/to/libnostructs.so ... 

再往实走SA 这些工具的时候,就会抛出变态挑示新闻有题目

Exception in thread "main" java.lang.reflect.InvocationTargetException         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)         at java.lang.reflect.Method.invoke(Method.java:498)         at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)         at sun.tools.jstack.JStack.main(JStack.java:106) Caused by: java.lang.RuntimeException: gHotSpotVMStructs was not initialized properly in the remote process; can not continue         at sun.jvm.hotspot.HotSpotTypeDataBase.readVMStructs(HotSpotTypeDataBase.java:418)         at sun.jvm.hotspot.HotSpotTypeDataBase.<init>(HotSpotTypeDataBase.java:91)         at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:395)         at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)         at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)         at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)         at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)         at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)         ... 6 more 

本文转载自微信公多号「Tomcat那些事儿」,能够经历以下二维码关注。转载本文请有关Tomcat那些事儿公多号。

 

【编辑选举】

10个经典又容易被人无视的JVM面试题 掌握这3个技巧,你也能够秒懂JAVA性能调优和jvm垃圾回收 带你学习jvm java虚拟机 arthas/性能调优/故障倾轧/gc回收/内存溢出等 11组有关带你望清JVM全貌 2020年JVM教程互联网架构JAVA虚拟机视频 JVM大厂教程


Powered by 彩票9.99平台-彩票9.99倍平台 @2018 RSS地图 HTML地图

导航

热点推荐

最新发布

友情链接