JVM:有些内部信息我悄悄告诉你

JVM:有些内部信息我悄悄告诉你

作者: 侯树成 2020-12-30 09:18:46

云计算

虚拟化 对于 Java 的反射使用, 一般用户都有所了解。特别是在开源框架里更是大量的使用。通过反射,我们能拿到一个Java Class 的信息。

[[361071]]

对于 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。

  1. extern void *gHotSpotVMStructs; 
  2.  
  3. int Agent_OnLoad(void *vm, char *options, void *reserved) { 
  4.     gHotSpotVMStructs = 0; 
  5.     return 0; 

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

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

再去执行SA 这些工具的时候,就会抛出异常提示信息有问题

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

本文转载自微信公众号「Tomcat那些事儿」,可以通过以下二维码关注。转载本文请联系Tomcat那些事儿公众号。

 

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/282463.html<

(0)
运维的头像运维
上一篇2025-05-13 11:40
下一篇 2025-05-13 11:42

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注