当前位置: 首页 > 知识库问答 >
问题:

对Permgen空间这种行为的解释

云承天
2023-03-14

我正在用一个项目中相互协作的两个独立的Web应用程序来试验一些问题。在进行了X次部署之后,我得到了臭名昭著的“java.lang.OutofMemoryError:PermGen Space”错误。

所以我已经用VisualVM监视PermGen空间一段时间了,不断地重新部署应用程序,看看发生了什么。

这里有奇怪的行为:

首先,我已经重新部署了15倍以上的第一个应用程序。行为与预期的一样:内存图就像一个梯子,不断增加,直到接近最大大小(67MB)。在这一点上,内存被释放并返回到初始级别。

当我重新部署第二个应用程序时也是如此。

然后,我尝试同时重新部署这两个步骤(tomcat按顺序进行),梯子的“台阶”的大小更大,但行为与单次部署相同。

谢谢!

共有1个答案

云和同
2023-03-14

行动在这里。

我已经对此做了一些研究,我的结论是,完全理解与permgen空间相关的JVM行为或多或少是不可能的:)

在这一点上,我们都阅读了一些关于可能与类加载器相关的内存泄漏的主题。类的定义不会被使用,而是存储在内存中,直到超过permgen-limit。那是理论。但是很难真正知道这个泄漏的起源,我的意思是,如果我们的应用程序中有内存泄漏是由糟糕的编程引起的,还是不是。

export CATALINA_OPTS="-Xms64m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled"

其中:

-xms64m将java堆内存的最小大小设置为64MB。

-xmx512m将java堆内存的最大大小设置为512MB。

-xx:permsize=128m将permgen内存的初始大小设置为128MB。

-xx:maxPermsize=512m将permgen内存的最大大小设置为512MB。

-XX:+CMSClassUnloadingEnabled:垃圾收集器将清除PermGen并删除不再使用的类。

 类似资料:
  • 问题内容: 我正在研究有关Java 6 18 VM上垃圾回收的各种选项,并希望有一些指导。 我们在JBoss上运行我们的应用程序,并且在重新部署期间偶尔会出现臭名昭著的PermGen错误。关于解决或缓解此问题的最佳方法,Internet上存在许多相互矛盾且过时的信息。 从我所看到的,以下是正确的: VM选项本身 无法解决此问题 ,只能将其推迟。 解决此问题的唯一可靠方法是修复Application

  • 下面是一些React/JS代码:有区别吗: 和 非常感谢

  • 据此: 在系统中安装了Maven之后,下一步就是对其进行微调以获得最佳性能。默认情况下,最大堆分配为256-512 MB(-XMS256M到-XMX512M)。在构建大型复杂Java项目时,此默认限制不起作用,建议您至少拥有1024 MB的最大堆。 现在,我认为堆空间和permgen空间的max和min值是由JVM设置的。Maven只能通过我们设置的MAVEN_OPTS env变量来设置它们。那么

  • 问题内容: Netbeans每15-30分钟显示一次“ ”。从我从Google那里学到的信息来看,这似乎与类加载器泄漏或内存泄漏有关。 不幸的是,我发现的所有建议都与应用程序服务器有关,并且我不知道将其应用于Netbeans。(我什至不确定这是同一个问题) 我的应用程序有问题吗?我如何找到来源? 问题答案: 这是因为常量类加载。 Java将类字节码和所有常量(例如,字符串常量)存储在默认情况下不会

  • 我们的环境中有Java . lang . out of memory error:perm gen空间:Windows Server 2012 R2 64位8GB RAM JRE 1.7 u80 Tomcat 7 . 0 . 73 ActiveMQ 5 . 9 . 0 Mule runtime 3 . 5 . 4 Mule management console 3 . 5 . 3部署在Tomcat

  • 问题内容: 限制Java JVM上Permgen空间大小的目的是什么?为什么不总是将其设置为等于最大堆大小?Java为什么默认为这么少的64MB?他们是否正在试图通过这种方式迫使人们注意代码中的Permgen问题? 如果我的应用使用85MB的permgen,那么将其设置为96MB可能是安全的,但是如果它只是主堆的一部分,为什么还要设置得如此之小呢?允许JVM使用堆允许的PermGen效率不高吗?