gpt4 book ai didi

java - 不使用 native 代码跟踪 Java 堆

转载 作者:行者123 更新时间:2023-11-30 07:11:48 24 4
gpt4 key购买 nike

有一段时间我在摆弄 Java 堆。使用 JVMTI ,我们可以跟踪 java 堆。

但是有什么方法可以使用纯 java 实现相同的目的吗?

我正在使用 java 工具和 asm 框架在运行时进行类转换。

我的目标是跟踪创建的每个对象,这意味着我需要定期检查它们的大小。我可以检查是否使用 asm 创建了新对象。我需要的是检查从堆空间创建的对象的大小。

在这方面有什么建议吗?

2013 年 12 月 28 日编辑

好的,我能够从 ASM 做一些事情,尽管它可能不是最好的解决方案(最好的方法是 JVMTI,我完全同意)。

我必须覆盖 visitVarInsn(对于局部变量)、visitFieldInsn(对于实例和类变量)和 visitTypeInsn(对于 NEWNEWARRAY 对象被创建)

每次创建一个新的对象时,我都会记录这个对象(是的,我知道这不是一个好方法,这可能会导致资源泄漏。如果您有更好的解决方案,请告诉我。我需要太糟糕了 [:( ] )我会定期检查对象大小。

你能给我提供更好的选择吗? (正如 Stephen 正确指出的那样,这个对象记录肯定行不通,但我对 JVMTI 和 [:(]) 都不满意。另外,请原谅我的无知,我找不到合适的MXBean 方法。

MemoryMXBeangetHeapMemoryUsage() ,但我无法通过此方法跟踪单个对象的大小。可能我应该编写自己的 MBean

最佳答案

我猜你理论上可以做到。对象的(浅)大小很容易根据对象字段的数量和类型计算出来,并且您可以使用 ASM 工具将代码插入到每个构造函数中,以便在每次构造对象时记录大小(某处)。

处理数组会很棘手。数组分配不需要构造函数,因此您需要检测创建数组的所有位置。由于其中一些地方可能在 native 代码中,因此很难看出您将如何做到这一点。

另一个棘手的情况是处理在不调用构造函数的情况下创建对象的事情;例如对象序列化和 native 克隆。

总而言之,这可能不是一个实用的方法。


另一点是,任何使用 ASM 和类似东西的东西都可以说不是“纯 Java”……除非使用实际上是 JVM 本身的一部分。

关于java - 不使用 native 代码跟踪 Java 堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20795767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com