【问题标题】:Non-aligned pointer being freed, in Java?在Java中释放非对齐指针?
【发布时间】: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


【解决方案1】:

你不要在 Java 本身中调试这类东西,因为这看起来要么是 JVM 本身的错误,要么是一些流氓本机库。

【讨论】:

  • 是的,它是一个流氓库:OSX 上的 CoreMIDI 实现。切换到humatic.de/htools/mmj.htm 可以解决问题。所以,是的,在 Java 中没有什么需要修复的。
猜你喜欢
  • 2017-12-23
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多