Java中的不可交换内存分配
我知道这很难实现,但我需要构造一个安全的临时对象,其中一个想法是在内存中构造一个不会被交换到驱动器的缓冲区。这在Java中可能吗?简言之:不可能Java中的不可交换内存分配,java,Java,我知道这很难实现,但我需要构造一个安全的临时对象,其中一个想法是在内存中构造一个不会被交换到驱动器的缓冲区。这在Java中可能吗?简言之:不可能 您可以尝试JNI直接与主机操作系统交互(当然这不是平台独立的)。NIO支持一种通常称为直接缓冲区的ByteBuffer类型。直接缓冲区本质上可以像任何其他ByteBuffer一样使用(并作为ByteBuffer子类实现),但其基本内存是在Java堆之外分配的 但从现在起,缓冲区就在操作系统的控制之下。据我所知,您无法指示操作系统不交换驱动器。交换驱动器
您可以尝试JNI直接与主机操作系统交互(当然这不是平台独立的)。NIO支持一种通常称为直接缓冲区的ByteBuffer类型。直接缓冲区本质上可以像任何其他ByteBuffer一样使用(并作为ByteBuffer子类实现),但其基本内存是在Java堆之外分配的
但从现在起,缓冲区就在操作系统的控制之下。据我所知,您无法指示操作系统不交换驱动器。交换驱动器是由操作系统完成的,我相信不是由java完成的。。这对你有什么影响?纯粹是出于兴趣。这是操作系统的问题,而不是JVM的问题。可能不相关的侧节点:使用带有随机密钥的加密交换,可以在任何交换出的页面上提供会话到会话的安全性。这绝对不是操作系统的问题。使用本机库,您可以分配一个声明为不可交换到操作系统的内存块。这可以防止您强制操作系统交换以获取进程内存的磁盘映像的某些攻击。从提供的答案来看,您似乎无法在Java中分配保证不交换的内存。但是,即使有一种独立于平台的方法(例如,
noswap String s=“我是安全的。”;
),您会如何处理该对象?如果调用诸如System.out.println(s)
之类的方法,则不能保证println
不使用需要交换的缓冲区。类似地,用于从持久性存储读取“安全”对象的方法也可能使用缓冲区和可交换的缓冲区。即使是垃圾也可以在重新分配之前进行交换。