尽管有足够的PermSize和OldGen空间,JVM是否可以遇到“java.lang.OutOfMemoryError:”

时间:2012-11-02 05:59:52

标签: garbage-collection jvm

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

2 个答案:

答案 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。