如果你有一个非常重要的java程序,而且是线上服务,对delay要求很高。但是 偶 尔发现系统在负载很轻变化到负载较重的时候响应时间有点慢, 或者某些 冷 门 query比较慢。你用工具发现os有不少page fault,但是你知道机器有足 够的 内存 分配给JVM,那么可能需要调整一下swappiness了。
swappiness
http://en.wikipedia.org/wiki/Swappiness
操作系统会根据一定的策略自动换出不常使用的内存,这样的优点是有足够的空闲内存给新的程序使用。但有的时候我们有一些关键程序,需要很快的响应时间。但是它可能有些内存不是经常使用,而是偶尔用到,万一用到的时候不在内存,那么就会产生page fault。
我们可以根据上面的wiki调整这个参数
JVM记得设置 -Xmx == -Xms
调整某个进程的swappiness
但是上面的方法有个缺点,它的修改是全局的。我们其实是想某些“关键”程序的内存不被换出,那些不那么重要的程序最好还是换出去。那上面的方法就不行了。
http://unix.stackexchange.com/questions/10214/per-process-swapiness-for-linux
更好的方法
前面的设置非常麻烦,而且需要修改Linux的配置。
mlockall
http://linux.die.net/man/2/mlockall
这正是我们想要的,但是我们需要在Java里实现
JNA
Apache Cassandra就使用了这个方法来保证JVM的内存不被换出