Java内存分配对齐

Neo*_*cer 16 java memory-management memory-alignment

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

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

谢谢.

Spi*_*nim 8

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

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

  • 反复分配和尝试操作是一个疯狂的*hack,很容易导致崩溃或无限循环.请参阅Nitsan的答案以获得更好的方法. (2认同)

Nit*_*art 5

有关java中直接内存对齐的更广泛讨论,请参阅此博客文章,其中也涵盖了您的要求.总结一下:

  1. 高达JDK 1.6所有直接字节缓冲区都是页面对齐的,所以如果这是你所使用的java版本,你就会被排序.
  2. 从1.7开始,您可以按照帖子中列出的方法获取对齐的缓冲区.

我建议你不要重复分配,直到你找到正确的地址..这对你的软件来说非常糟糕.如果您计划重复获取地址,我建议您在计划使用上述反射方法时对其进行缓存.或者,使用不安全的帖子中概述的方法来获取地址字段的值.

  • 事实证明,你也可以这样做:`((DirectBuffer)ByteBuffer.allocateDirect(...)).address()` (2认同)