我试图找到一些近似值来解决堆问题,你们给了我这个函数System.IdentityHashCode(Object)
。
问题是 - 这个函数不适合原始类型。我会解释为什么。
我被作为输入 Java 编译程序 - 类文件。我的目标是绘制一些图表,其中将包含有关时间之间变量访问的一些信息。我事先不知道代码的外观,我的策略是为每个 LOAD 和 STORE 指令检测我自己的字节码。我正在使用 ASM Java 字节码检测。
因此,我不能做类似的事情:
identityHashCode(Integer.valueOf(...))
因为我不知道类型是 int、double、long 等。
我希望能够确定同一类的不同实例之间:
例如 :
class foo {
int a;
}
foo b;
foo c;
b.a++;
c.a++;
但是当涉及到字节码时,名称“b”/“c”与属性 a 之间没有关系。我“看到”的只是 a 增加了。两者都被视为一个!如果是这样,Object a
我可以使用 System.identityHashCode() 来区分它们。但我不能。
为了清楚起见,请看以下示例:
package manipulate;
public class Test {
int c;
public static void main(String[] args) {
Test a=new Test();
Test b=new Test();
a.c++;
b.c++;
}
}
它将被翻译(主函数)为以下字节码:
L0
LINENUMBER 7 L0
NEW manipulate/Test
DUP
INVOKESPECIAL manipulate/Test.<init>()V
ASTORE 1
L1
LINENUMBER 8 L1
NEW manipulate/Test
DUP
INVOKESPECIAL manipulate/Test.<init>()V
ASTORE 2
L2
LINENUMBER 9 L2
ALOAD 1
DUP
GETFIELD manipulate/Test.c : I
ICONST_1
IADD
PUTFIELD manipulate/Test.c : I
L3
LINENUMBER 10 L3
ALOAD 2
DUP
GETFIELD manipulate/Test.c : I
ICONST_1
IADD
PUTFIELD manipulate/Test.c : I
L4
LINENUMBER 11 L4
RETURN
正如你所看到的,我在堆栈上得到的只是整数 c 的值。因此,鉴于该代码,我无法确定这两个 c 之间!