jvm优化

开发人员:Takipi会告诉您何时新代码在生产中中断–了解更多

我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射。 它是Java和Scala编程的主要方面,它使我们使用的库可以与我们的代码进行交互,而无需对其进行硬编码的知识。 但是我们对反射的使用仅限于在JVM中运行的Java和Scala代码。 如果我们可以使用反射不仅在运行时查看我们的代码,而且还查看JVM的代码怎么办?

当我们开始构建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如何实际提供这些功能。 这种方法的基石在于由gvm库公开导出的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的界面公开了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

jvm优化

jvm优化_镜像镜像–使用反射在运行时查看JVM内部相关推荐

  1. jvm 内存镜像_镜像镜像–使用反射在运行时查看JVM内部

    jvm 内存镜像 开发人员:Takipi会告诉您何时新代码在生产中中断– 了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射. 它是Java和Scala编程的主要方面,它使我们 ...

  2. 镜像镜像–使用反射在运行时查看JVM内部

    开发人员:Takipi会告诉您何时新代码在生产中中断– 了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射. 它是Java和Scala编程的主要方面,它使我们使用的库可以与我们 ...

  3. jvm优化_使用Java流和In-JVM-Memory的超低延迟查询

    jvm优化 自然界的基本规则(例如光速和通用信息论)对我们可以从传统系统体系结构中获得的最大性能设置了明显的限制. 了解您作为Java开发人员如何使用JVM技术和Java流将性能提高几个数量级. 例如 ...

  4. jvm优化_在JVM中记录世界停顿

    jvm优化 不同的事件可能导致JVM暂停所有应用程序线程. 这种暂停称为世界停止(STW)暂停. 触发STW暂停的最常见原因是垃圾回收( 例如github中的示例),但是不同的JIT操作( 示例),偏 ...

  5. jvm优化_您的JVM是否泄漏了文件描述符-像我的一样?

    jvm优化 前言:此处描述的两个问题是在一年前发现并修复的. 本文仅作为历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快速且 ...

  6. java8的jvm优化_基于JDK8 版本的SpringBoot 启动参数优化(建议收藏)

    Linux端运行项目命令 java -jar -XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=128m-Xms1024m -Xmx1024m-Xmn256m-Xs ...

  7. linux 查看jvm虚拟内存_看完你还敢说你懂JVM吗?

    在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...

  8. 2019年Java和JVM生态系统预测:OpenJDK将成为Java运行时市场领导者

    本文对2019年Java和JVM生态系统做了一些预测. 正如InfoQ 2018年度总结中说的那样,Java在2018年的发展势头非常有意思. 在我们步入2019之际,让我们来看看在新的一年中Java ...

  9. 使用Emit反射建立运行时实体模型

    做这个功能目的是对旧项目代码分析管理,代码规划. 如果重头开发,统一一个框架小框架搞,人.时间到位都不是问题.但是旧应用系统优化,项目更新,就几个人开发加维护,接口层越多,bll层越来越厚,人来人往留 ...

最新文章

  1. android读写文本文件,Android读写文件
  2. 隐藏apache版本号的方法
  3. 重新学习的HTTP协议
  4. mybatis数据库数据分页问题
  5. Ubuntu 8.10的5个新特色
  6. I.MX6 查看baudrate确定是否被其他程序占用
  7. C++米勒拉宾算法模板
  8. Linux---基础指令
  9. 20211010 PHP笔记
  10. 人工智能感知技术是机器人应用支撑技术之一
  11. vmware vsphere出现“需要整合虚拟机磁盘”的告警处理方法(完整版)
  12. 安装VMWare Workstation 12的步骤
  13. java项目ppt介绍_Java课设项目介绍及分析.ppt
  14. EPS FB信令流程
  15. Linux服务器云锁安装步骤
  16. 220913_100620-华为全球校园AI算法赛事(推荐方向):广告-信息流跨域CTR预估
  17. 定时线程池实现请求合并
  18. 精仿交易猫手游1:1源码可运营 支持二维码收款
  19. String StringBuffer StringBuilber
  20. oracle监控pga,oracle pga使用情况常用脚本:

热门文章

  1. spring的BeanWrapper类的原理和使用方法
  2. 将你的 CentOS 变成 OSPF 路由器
  3. 小朋友的视频直播之 nginx-rtmp
  4. Linux下如何查看哪些端口处于监听状态
  5. 开发板 pc机 虚拟机 三者之间如何互ping通
  6. 2013杭电warm up1 hdu 4712 Hamming Distance
  7. object-c 常见问题
  8. 利用ASP.NET生成静态页面
  9. tomcat进程意外退出的问题分析
  10. centos7 安装 xfce桌面