为什么会出现Permgen OutOfMemoryError错误?

3
直到今天,我知道 permgen 空间有一些限制,当这个限制耗尽时,会出现 OutOfMemoryError ,我认为这是正确的,因为我见过 OutOfMemoryError Permgen空间。

但是 Java虚拟机内部引用说:

方法区的大小不需要固定。随着Java应用程序的运行,虚拟机可以扩展和收缩方法区以适应应用程序的需求。

那么,当JVM可以扩展时,为什么还会出现错误?是否有扩展的限制?

1个回答

3
方法区(Method Area)是更大的PermGen或非堆内存区域的一部分。 PermSize设置固定了PermGen可以使用的最大内存。由于方法区PermGen的一部分,只要整个PermGen大小保持在指定的限制范围内,方法区就可以根据需要进行扩展。
一旦PermGen空间需求超出指定限制(例如由于扩展方法区),将抛出OutOfMemoryError异常。

进一步澄清,当在运行时通过自定义类加载器加载类时,您可能会过度拉伸permgen,例如加载太多类。 - Yaneeve
这实际上是从个人经验中得出的。不过,我通过谷歌搜索找到了以下有用的链接:
http://frankkieviet.blogspot.co.il/2006/10/classloader-leaks-dreaded-permgen-space.html
http://www.kdgregory.com/index.php?page=java.outOfMemory
http://plumbr.eu/blog/what-is-a-permgen-leak
http://javaeesupportpatterns.blogspot.co.il/2011/02/outofmemoryerror-permgen-patterns-part1.html
- Yaneeve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接