如何限制Java进程RAM的使用

时间:2018-06-28 05:27:45

标签: java jvm

在堆中,我们可以使用-Xms -Xmx来限制ram的使用。

在jvm的堆之外,使用NIO时,我们可以使用-XX:MaxDirectMemorySize。

但是在职业游戏中像这样

public class MappedBufferTest {
    static long length = 1024*1024*512; //
    public static void main(String[] args) throws Exception {
        try (FileChannel fc = new RandomAccessFile("data.txt", "rw").getChannel()) {
            MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, length);
            int i = 0;
            for (; i < length/2; i++) {
                out.put((byte) 'x');
            }
            Thread.sleep(30*1000);
            System.out.println("writing");
            for (; i < length; i++) {
                out.put((byte) 'x');
            }
            System.out.println("Finished writing");
            Thread.sleep(60*1000);
            fc.close();
        }
    }

}

具有jvm选项

-Xms256m -Xmx256m -XX:MaxDirectMemorySize = 128m

运行良好。不会发生oom错误。

-XX:MaxDirectMemorySize不起作用?

java 1.8 os:centos

2 个答案:

答案 0 :(得分:0)

您可以使用ulimit限制进程可用的虚拟内存量,该虚拟内存包括映射文件。但是随后,您必须考虑所有JVM的需求,以避免被杀死。

如果您只关心驻留内存,也可以使用cgroups。

答案 1 :(得分:0)

映射的文件不使用私有内存。您正在使用操作系统的磁盘缓存。

虽然内存映射文件会增加虚拟内存,但会根据需要分页数据,因此即使您映射的文件大于主内存,您仍然不会超出设置的限制。

注意:因为您最近访问过文件,所以文件可以在内存中。如果某个程序碰巧将其映射到内存,则并不意味着该程序正在使用的内存量与该程序是否在运行一样多。

例如在Linux上,您可以映射到100 TB的文件中,而无需增加堆或直接使用内存。