当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in
内存锁就是将进程的虚拟内存的部分或者全部锁进内存以确保它们总是位于物理内存中,一是可以确保永远不会因为分页故障发生延迟(提升性能),二是敏感数据不会被写入磁盘。
jdk本身没有提供锁定内存的api,如果需要锁定内存,可以通过jni去调用linux的api达到目的。下面是elasticsearch的实现
org.elasticsearch.bootstrap.JNANatives
static void tryMlockall() {
int errno = Integer.MIN_VALUE;
String errMsg = null;
boolean rlimitSuccess = false;
long softLimit = 0;
long hardLimit = 0;
try {
int result = JNACLibrary.mlockall(JNACLibrary.MCL_CURRENT);
... ...
}
}
org.elasticsearch.bootstrap.JNACLibrary
static native int mlockall(int flags);