如果应用程序有足够的空间用于 PermSize 和 OldGen 空间,是否还可能遇到 OutOfMemoryErrors?
问问题
82 次
2 回答
1
是的。您的代码库中的某个人可能会抛出它,或者 Sun ... er Oracle ;) 可能会抛出它。例如从 ByteArrayOutputStream 看这段代码:
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = buf.length;
int newCapacity = oldCapacity << 1;
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity < 0) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
buf = Arrays.copyOf(buf, newCapacity);
}
http://www.docjar.com/html/api/java/io/ByteArrayOutputStream.java.html
于 2012-11-02T15:05:06.293 回答
1
除了 Perm Gen 和 Old Gen。JVM 可能会使用非堆内存(例如用于直接内存缓冲区)。非堆内存的数量受-XX:MaxDirectMemorySize
选项限制。如果超过,将抛出 OutOfMemoryError。
于 2012-11-03T07:46:52.250 回答