我做了一个简单的库来测量给定对象的大小。该库是通过JNI从Java类访问的 。它专门为Hotspot设计,因此它使用JVMTI并调用GetObjectSize
。使用System.load和库设置为代理
我的问题是,有什么更好的解决方案?
要装入使用
System.load("library")
或设置库作为代理,并明确地通过发出带有代理信息选项java命令装载它的库。
我见过
所有类似的例子至今使用的代理功能:
以何种方式是,不仅仅是加载库更高效?
谢谢!
我做了一个简单的库来测量给定对象的大小。该库是通过JNI从Java类访问的 。它专门为Hotspot设计,因此它使用JVMTI并调用GetObjectSize
。使用System.load和库设置为代理
我的问题是,有什么更好的解决方案?
要装入使用System.load("library")
或
设置库作为代理,并明确地通过发出带有代理信息选项java命令装载它的库。
所有类似的例子至今使用的代理功能:
以何种方式是,不仅仅是加载库更高效?
谢谢!
命令行注入的优点是代理与虚拟机一起加载。您可以在不修改程序的情况下将代理注入到每个Java程序中。与System.load
,这在调用点完成。您可以对更大的一组回调作出反应,例如有一个VM Initialization Event。如果您使用System.load
该事件已过。
因此,我不认为使用命令行注入更加高效,但对某些用例更有效。
对不起,一年迟来的答案检查。感谢您的解释。我结束了使用库函数,因为在我的情况下,使用库来计算对象内存消耗,代理提供了最小的优势。 – Paul
为什么你需要这个?你为什么不使用内存分析器来查找对象的大小? – Cratylus
内存分析器将太重。我正在努力扩展一个对methodes/classes进行正式堆分析的工具。公式取决于类实例的大小。现在,这个大小被正式提及,如(Sizeof String实例)或(Sizeof Object实例)。我想要做的是专门针对每个JVM实现。基本上,用实际数字替换条款。对于一个虚拟机实施已经有了专业化。该计划是为各种虚拟机添加专业化。 – Paul