如果应用程序有足够的空间用于PermSize和OldGen空间,是否可能会遇到OutOfMemoryErrors?
答案 0 :(得分:1)
是。你的代码库中的某个人可能会抛出它或Sun ...呃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
答案 1 :(得分:1)
除了Perm Gen和Old Gen.JVM可以使用非堆内存(例如,用于直接内存缓冲区)。
非堆内存量受-XX:MaxDirectMemorySize
选项的限制。如果超出则将抛出OutOfMemoryError。