【发布时间】:2018-06-28 05:27:44
【问题描述】:
在堆中,我们可以使用 -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 操作系统:centos
【问题讨论】:
-
不工作是什么意思?错误是什么?
-
MaxDirectMemorySize限制ByteBuffer.allocateDirect分配的内存。映射的字节缓冲区不计算在内。由于它们由文件支持,因此它们不必占用 RAM - 操作系统可以在认为必要的任何时候将页面刷新到磁盘。 -
在操作系统的监视器中。我可以将进程的 ram 增长到 512m。为什么不限制128m。
-
此选项并非旨在限制 RAM 使用率