2

如果应用程序有足够的空间用于 PermSize 和 OldGen 空间,是否还可能遇到 OutOfMemoryErrors?

4

2 回答 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 回答