Java,一种固定和对齐数组的方法

Java,一种固定和对齐数组的方法,java,arrays,bytebuffer,memory-alignment,Java,Arrays,Bytebuffer,Memory Alignment,我可以创建一个具有特定对齐方式的整数数组并阻止gc移动它吗 int [] arr = stopGcAndPageAlign(new int[1024]); or int [] arr = pin(align(new int[1024],4096)); 因此,我可以使用use_HOST_PTR将其用作opencl程序的源代码(这需要页面对齐或一些大的数字,如4096对齐) 当我创建一个4M长的数组时,它有很高的对齐概率,但当数组较短时,它不会对齐,opencl失败 我需要一个方法来获得一个

我可以创建一个具有特定对齐方式的整数数组并阻止gc移动它吗

 int [] arr = stopGcAndPageAlign(new int[1024]);
 or
 int [] arr = pin(align(new int[1024],4096));
因此,我可以使用use_HOST_PTR将其用作opencl程序的源代码(这需要页面对齐或一些大的数字,如4096对齐)

当我创建一个4M长的数组时,它有很高的对齐概率,但当数组较短时,它不会对齐,opencl失败

我需要一个方法来获得一个简单的java数组,然后使其固定和对齐(就像在直接字节缓冲区中一样),而无需进入JNI。我应该将直接字节缓冲区包装为非托管java数组吗?(但这可能会更难?)

在C#中,有封送选项,也许java有类似的功能

我可以告诉GC停止管理它并为我移动到某个空的/对齐的位置吗

下面的代码是否始终有效

  // can java move the second array right at ending of first one or starting of next page?
  public class MyAlignedArrayWrapper
  {
       public int [] alignerArray;
       public int [] alignedArray;
       public MyAlignedArrayWrapper()
       {
              alignerArray=new int[1024*1024*32]; // forces below alignment
              alignedArray=new int[113];          // so this is page aligned
                                                  // at least
       }

       public int[] getArray()
       {
             return alignedArray;
       }
  }

我认为一些java的家伙拼命地等待这一点,以便为他们的应用程序增加更高的速度,但却没有被迫消耗超过所需填充的更多内存。

如果没有JNI,我不认为这是可能的。普通Java对象总是有资格被GC移动。我能告诉GC停止它并为我移动一个数组吗?不。只要你呆在javaland中,你几乎无法控制gc。gc是一个神奇的黑匣子。你无法控制它;它可以在任何时间以任何理由移动任何对象。您看过sun.misc.Unsafe.allocateMemory()吗?