【发布时间】:2022-01-24 05:22:08
【问题描述】:
try {
// If no exception was thrown from map0, the address is valid
addr = map0(imode, mapPosition, mapSize);
} catch (OutOfMemoryError x) {
// An OutOfMemoryError may indicate that we've exhausted memory
// so force gc and re-attempt map
System.gc();
try {
Thread.sleep(100);
} catch (InterruptedException y) {
Thread.currentThread().interrupt();
}
try {
addr = map0(imode, mapPosition, mapSize);
} catch (OutOfMemoryError y) {
// After a second OOME, fail
throw new IOException("Map failed", y);
}
}
来自jdk/FileChannelImpl.java at jdk8-b120。
这对异常恢复有帮助吗?
【问题讨论】:
-
JRE 的 System.gc() 是无操作的,因此如果您的 JRE 是其中之一,它不会改变任何事情。在抛出异常之前,JRE 也可能已经尝试执行 gc。
-
这是一种特殊情况,因为垃圾收集器不跟踪本机内存,但本机缓冲区的清理取决于垃圾收集器检测到前端的不可达性
ByteBuffer。
标签: java java-8 garbage-collection