● 摘要
如何充分有效的获取Java堆中对象的信息是进行Java程序调试、检测和运行时优化的一个关键问题。分析当前国内外的研究现状后本文发现,现有的Java对象信息获取方法并不能完全满足当前的需求,它们通常会通过修改对象在内存中的布局结构来记录对象的状态信息,具有较低的兼容性以及可扩展性,并且有可能为Java虚拟机带来较大的额外负载。
针对这些问题,本文提出了一种基于时间访问标记的Java对象信息获取方法。论文详细介绍了该方法的理论基础和具体算法,以及在此基础上实现的软件系统。该方法基于一种独创的“地址链”对象轨迹跟踪和标识机制,在不修改Java虚拟机中对象内存布局相关的结构体的情况下,仅通过修改部分Java虚拟机代码,即可在Java程序运行时将对象的物理地址移动轨迹记录并传输到数据接收节点之上,并可以同时记录其他感兴趣的信息,例如对象分配地址等;而在数据接收节点上,通过运行对象信息整理程序可以重建对象地址链,统计出对象的生命周期等信息。这种方法不会增加Java堆的负载,可以方便的调整获取对象信息的种类,且可以适用于各种不同类型的垃圾回收算法,具有良好的扩展性和兼容性。
本文选取Apache Harmony 6.0虚拟机的DRLVM 版本进行系统的实现,并使用SPECjvm2008、SPECjbb2005、Dacapo等权威基准测试程序测试该方法对Java虚拟机带来的运行时负载。结果显示该方法属于一种轻量级的对象信息获取方法,运行SPECjvm2008的平均负载约为5%,运行SPECjbb2005和Dacapo的平均负载都约为8%,均明显优于其他类似系统。通过对获取信息的分析可以为Java虚拟机的运行时调试和优化提供数据支持。
相关内容
相关标签