我有一段时间摆弄Java堆。使用JVMTI
,我们可以跟踪Java堆。
但是有什么方法可以使用纯Java实现相同的目标吗?
我正在使用Java工具和asm框架在运行时进行类转换。
我的目标是跟踪创建的每个对象,这意味着我需要定期检查它们的大小。我可以检查是否使用asm创建了新对象。我需要检查从堆空间创建的对象的大小。
在这方面有什么建议吗?
于2013年12月28日编辑
好的,尽管它可能不是最好的解决方案,但我能够从ASM进行一些操作(最好的方法是JVMTI
我完全同意)。
我必须重写visitVarInsn
(对于局部变量),visitFieldInsn
(对于实例和类变量)和visitTypeInsn
(对于NEW
和NEWARRAY
创建对象)
每次创建新对象时,我都会记录该对象(是的,这不是我知道的好方法,这可能会导致资源泄漏。如果有更好的解决方案,请告诉我。我非常需要它[:( ]),然后定期检查对象大小。
您能给我提供更好的选择吗?(正如Stephen正确指出的那样,该对象记录绝对不会起作用,但是我JVMTI
对[:(])都不满意。此外,请原谅我的无知,我找不到合适的MXBean
方法。
MemoryMXBean具有getHeapMemoryUsage()
,但我无法通过此方法跟踪单个对象的大小。也许我应该写我自己的MBean
。
由于使用的是Instrumentation,因此您已经可以访问一个API,该API告诉您对象的大小。Instrumentation
用于修改类的字节码的同一类提供了该方法getObjectSize(Object)
。
您提到的有关对象跟踪的资源泄漏很容易解决。只需将对象放入WeakReference
s中即可。然后,您可以使用ReferenceQueue
来了解对象何时已被垃圾回收,这是您要跟踪堆使用情况时的重要功能。
但是我不太确定您要实现什么目标。
顺便说一句,据我所知,JVisualVM并没有使用JVMTI。但是,JVisualVM也不跟踪每个对象。完整堆分析需要堆转储。可以使用MXBean
名称"com.sun.management:type=HotSpotDiagnostic"
为的方法来发送方法调用dumpHeap(String outputFile, boolean live)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句