Qy *_*Zuo 10 java memory-management
下面的代码将分配大量的直接内存,但不会导致java.lang.OutOfMemoryError:直接缓冲内存:
//JVM args: -Xms10m -Xmx10m -XX:MaxDirectMemorySize=10m
public class DirectMemoryOOM {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Field f = Unsafe.class.getDeclaredFields()[0];
f.setAccessible(true);
Unsafe us = (Unsafe) f.get(null);
long size = 1024 * 1024 * 1024;
while (true) {
long p = us.allocateMemory(size);
for (int i = 0; i < size; i++) {
us.putByte(p + i, Byte.MAX_VALUE);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但代码下面的代码将获得java.lang.OutOfMemoryError:直接缓冲内存.我已经看到了Java不安全内存分配限制的答案,但ByteBuffer.allocateDirect是使用Unsafe.allocateMemory()实现的.
//JVM args: -Xms10m -Xmx10m -XX:MaxDirectMemorySize=10m
public class DirectMemoryOOM {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
int size = 1024 * 1024;
System.out.println(sun.misc.VM.maxDirectMemory());
while (true) {
ByteBuffer.allocateDirect(size);
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么限制失败发生在第一个?
正如最初的答案所说:Unsafe.allocateMemory()
是一个包装器os::malloc
,它不关心VM强加的任何内存限制.
ByteBuffer.allocateDirect()
将调用此方法但在此之前,它将调用Bits.reserveMemory()
(在我的Java 7版本中:) ,它会DirectByteBuffer.java:123
检查进程的内存使用情况并抛出您提到的异常.
归档时间: |
|
查看次数: |
1540 次 |
最近记录: |