【发布时间】:2012-02-18 02:21:20
【问题描述】:
这在 Objective-C 中很容易追踪,但在 Java 中我认为这种事情是不可能的。我看到的错误是:
java(7198,0x124a13000) malloc: *** error for object 0x1003109c1: Non-aligned pointer being freed
*** set a breakpoint in malloc_error_break to debug
如何在 Java 中设置这种类型的断点?或者,我将如何追踪有问题的对象?那个内存地址不是hashCode,对吧?
【问题讨论】:
-
我认为您将 Java 编译为 C,然后编译为二进制文件。你用的是什么编译器?当您将 Java 代码编译为普通 Java 字节码并在 JVM 上运行时会发生什么?
-
这都是 Eclipse 中使用标准 JVM 的 100% 标准内容。可能是 CoreMIDI 驱动程序...
-
Java 中的所有引用都以 8 字节的倍数对齐,因此最低三位始终为 0。如果最低位不为 0,则表明您有一个损坏的引用。
-
您可以使用 Unsafe 类执行此操作,否则它必须在 JNI 中。注意:如果您在 64 位 JVM 中使用 32 位引用,则不会发生这种情况,因为它会丢弃最低三位(因为它知道它将是 000),这允许您拥有高达 32 GB 的堆使用 32 位引用。
-
基本上 sun.misc.Unsafe 可以让你做大部分你不应该在 Java 中做的事情,但如果你想要低级编程,这些事情是有用的。例如以任何类型访问对象中的任何字段,例如将 int 写入引用。
标签: java