Java,一种固定和对齐数组的方法
我可以创建一个具有特定对齐方式的整数数组并阻止gc移动它吗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失败 我需要一个方法来获得一个
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()吗?