在堆中,我们可以使用-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
答案 0 :(得分:0)
您可以使用ulimit限制进程可用的虚拟内存量,该虚拟内存包括映射文件。但是随后,您必须考虑所有JVM的需求,以避免被杀死。
如果您只关心驻留内存,也可以使用cgroups。
答案 1 :(得分:0)
映射的文件不使用私有内存。您正在使用操作系统的磁盘缓存。
虽然内存映射文件会增加虚拟内存,但会根据需要分页数据,因此即使您映射的文件大于主内存,您仍然不会超出设置的限制。
注意:因为您最近访问过文件,所以文件可以在内存中。如果某个程序碰巧将其映射到内存,则并不意味着该程序正在使用的内存量与该程序是否在运行一样多。
例如在Linux上,您可以映射到100 TB的文件中,而无需增加堆或直接使用内存。