Java 内存分配对齐

我知道这在Java中是一个奇怪的问题,但是有没有办法让Java动态内存分配与一些对齐约束保持一致?例如,是否可以动态分配与页面大小对齐的对象?

我想这样做的原因是因为我将通过JNI接口从本机代码访问Java对象,并且本机代码库要求对象对齐。

谢谢。


答案 1

不,这是不可能的。请记住,Java 中堆上的对象可以在垃圾回收期间移动。您有一些选择:

  1. 停止直接从 JNI 访问 Java 对象。将您关心的内容复制到 JNI 提供的缓冲区中,本机代码已对齐该缓冲区。
  2. 使用 ByteBuffer.allocateDirect()。。然后找到正确对齐的缓冲区区域。一种方法是在启动时分配缓冲区,并在不同的偏移量下重复尝试对齐敏感操作,直到它起作用。这是一个黑客!

答案 2

请参阅此博客文章,以更广泛地讨论Java中的直接内存对齐,这也涵盖了您的要求。总结一下:

  1. 在 JDK 1.6 之前,所有直接字节缓冲区都是页面对齐的,所以如果这是你所在的 java 版本,你就会被排序。
  2. 从1.7开始,您可以自己动手,按照帖子中列出的方法获得对齐的缓冲区。

我建议您在找到正确的地址之前不要重复分配。这对您的软件来说非常糟糕。如果您打算重复获取地址,如果您打算使用上面概述的反射方法,我建议您缓存它。或者,使用帖子中概述的方法,使用 Unsafe 获取地址字段的值。