为什么没做就软了怎么回事它对外暴露了JVM里面的大都信息

  • 首页
  • 免费观 看成人网站
  • 将粗大挺进邻居人妻
  • 亚洲国产成人AV线
  • 伊人狼人大蕉香AV
  • 行房时间短怎么治
  • 为什么没做就软了怎么回事它对外暴露了JVM里面的大都信息
    发布日期:2022-09-23 06:08    点击次数:61
    激萌导航入口客户端为什么没做就软了怎么回事

    关于 Java 的反射使用, 一般用户都有所了解。相称是在开源框架里更是大都的使用。通过反射,我们能拿到一个Java Class 的信息。那关于 JVM 的里面信息,像堆的使用情况、线程、以至是创建对象的内存地址、加载的类的本色,该怎样办呢?

    其真的 JVM内,有许多里面的信息,比如上头提到的那些,就近似于生涯中的里面音问不异。你不错想像一些大型期骗,一些用户的数据我们只可通过 API 授权的神志拿到,凡俗用户过去使用的时辰,是不可能获得到这些本色的。就像做为运行在 JVM 上的凡俗 Java期骗,也很难拿到 JVM 的信息,毕竟 JVM 更底层,是C++ 开荒的。

    JVM 会把这些里面信息告诉我们吗?

    JVM 提供了一些对外的接口,把它的里面信息败露了出来。通过这些接口SA 才得以窥探到 JVM 里面类的结构和地址,也智力从底层洞悉到 JVM里面运行的细节。

    你看在SA 图形界面的HSDB里面,长长的菜单列表,大多都是通过凡俗Java 期骗获得不到的「里面信息」。

     

    这些都是怎样终了的呢?说到这儿, she就不得不提 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那些事儿公众号。