我正在尝试跟踪JVM中所有对象的分配。
在有关分配剖析器的几个文件中,有人提到最简单的方法是:
向invokestatic Tracker.trackAllocation()V
添加java/lang/Object.<init>
指令(通常它由一条return
指令组成,我们在它之前添加invokestatic
,因此现在是2条指令。
(我知道这种方法很慢并且不会跟踪数组分配,但我想从最简单的解决方案开始。我也不会将对已分配对象的引用传递给跟踪器,但稍后会添加。)< / p>
类文件在onClassLoaded钩子中使用JVM TI代理进行检测。
但是,添加invokestatic
指令后,JVM与segfault崩溃。
Tracker对象被添加到bootstrap类加载器中,因此它应该在任何阶段都可见。
我尝试添加nop
而不是invokestatic
,并且JVM可以与修改后的Object类一起使用。所以问题特别在于调用一些静态方法。
我还试图检测应用程序(不是基础的一部分)类并且它工作正常 - 跟踪器被调用并且没有发生崩溃。 此外,我尝试在2点重新定义Object:初始加载时(第一个加载的类),或者在vmInit事件之后(加载所有基类并解除对jni的限制)。
关于检测java.lang.Object有什么遗漏吗?
代理商的代码在这里: https://gist.github.com/Korobochka/3bf2f906f6ab85b22dec (错误检查被剥离,更改类的代码也不包括在内,但它对其他类来说效果很好)
答案 0 :(得分:5)
看起来问题在于从LeakAgentInterface调用System.out
。首先,println
可能尚未初始化。其次,<input id="name" class="input" name="name" type="text" value="" size="30" />
<input id="email" class="input" name="email" type="text" value="" size="30"/>
可以自己分配对象。