问题标签 [permgen]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 无休止的线程创建和运行最终会出现在 PermGen OOM 中吗?
在我的过程中,我不断创建一个新的 Thread 对象(实际上是 Thread 的子类)(每秒最多几个),运行它并干净地结束。
我注意到,例如,当进程运行 25 天时,进程可能会死掉,留下 hprof,这意味着 OOM。但是与分配给堆的内存相比,堆转储很小,所以它可能是 PermGen OOM,我正试图找出罪魁祸首。
我没有使用任何特殊的 jvm 参数,禁止 -XX:+HeapDumpOnOutOfMemoryError
java - 我们可以避免在java中插入字符串吗?
我们可以完全禁用字符串的驻留吗?它可能没有真正的帮助,但只是一个想法。我可以认为至少有一点可能会有所帮助,即在 jvm 调整期间,控制 perm gen 的大小。
例如,如果我给出了一个 OSGI 框架,并且任何人都可以添加自己的任意数量的捆绑包,并且每个捆绑包字符串实习可以完全搞砸我的调整参数。(当然我知道我们应该对给定的固定发行版进行调整,但仍然......)
有什么想法吗!!
java - 定位用死的 Groovy 代码填充 PermGen 的代码
我们的 glassfish 实例每两周关闭一次,有一段时间使用java.lang.OutOfMemoryError: PermGen space
. 我将 PermGen 空间增加到 512MB,并开始使用jstat -gc
. 两周后,我想出了下图,它显示了 PermGen 空间是如何稳定增长的(x 轴上的单位是分钟,y 轴是 KB)。
我尝试在谷歌上搜索某种可以查明错误的分析工具,并且在此处提到的 jmap 上的一个线程,这被证明是非常有帮助的。在从 转储的大约 14000 行中jmap -permstats $PID
,包含大约 12500行groovy/lang/GroovyClassLoader$InnerLoader
,指向我们自己的 Groovy 代码或 Groovy 本身的某种内存泄漏。我必须指出,Groovy 占相关代码库的比例不到 1%。
下面的示例输出:
那么我怎样才能继续了解更多关于是什么代码导致这种情况的呢?
从这篇文章中,我推断我们的 Groovy 代码在某处动态创建类。从 jmap 的转储中,我可以看到大多数死对象/类(?)具有相同的 parent_loader,尽管我不确定在这种情况下这意味着什么。我不知道如何从这里开始。
附录
对于后来者,值得指出的是,接受的答案并不能解决问题。通过不存储太多类信息,它只是将重新启动之前所需的时间延长了十倍。真正解决我们问题的是摆脱生成它的代码。我们使用了验证(按合同设计)框架OVal,其中可以使用 Groovy 编写自定义约束作为方法和类的注释。在纯 Java 中删除有利于显式前置和后置条件的注释很无聊,但它完成了工作。我怀疑每次检查 OVal 约束时都会创建一个新的匿名类,并且以某种方式关联的类数据导致内存泄漏。
java - PermGen 空间中的 Java 类大小
有很多关于 Java 对象大小的问答,这很容易理解。但我想知道 PermGen 空间中 Java 类的大小。
我想知道这个的原因是因为我正在编写一个代码生成器,生成很多类。本质上,我为数据库中的每个表/视图生成两个类。现在我还想为外键关系建模。而不是维护一个复杂的,可序列化的对象结构(考虑一个具有唯一键的表被属于其他具有其他外键的其他表的几个外键引用等),我宁愿生成一个类UNIQUE KEY
和一个类FOREIGN KEY
.
以下是我的问题:
- 我将在类加载器和 PermGen 空间上创建多少开销?
public
类、static
类和private
成员类之间有区别吗?- 您是否看到在源代码中生成外键信息的更好方法?
windows-7 - Windows 7、java 1.6.0_24 或 25m eclipse helios -->java.lang.OutOfMemoryError: PermGen space
我有一个问题,使用 xtext 1.0.2 制作 eclipse 建模 helios SR2,如果我有项目,在启动时崩溃。如果我尝试更新 eclipse 它会崩溃。构建工作区时它崩溃。
在“Workbench early startup”期间发生内部错误。java.lang.OutOfMemoryError: PermGen 空间
!MESSAGE 在“联系软件站点”期间发生内部错误。java.lang.OutOfMemoryError: PermGen 空间
我正在使用 Windows 7、64 位和 32 位的 jdk 1.6.0_25_b06 和 32 位的 eclipse。在全部 64 位中,我有更多的问题。
我尝试配置 eclipse .ini 文件,但没有找到正确的内存配置参数。
我真的需要帮助解决这个问题。
提前致谢。
java - 强制一个 Tomcat 处理的 DataSource 被急切地初始化
在 Java Web 应用程序中消除了几个与 PermGen 相关的问题后,我达到了以下几点:
- 该应用程序在 Tomcat 6.0.32 中运行并使用 Tomcat 管理的
DataSource
DataSource
定义在$TOMCAT_HOME/conf/context.xml
- 当应用程序启动时,它会查找
DataSource
并且只有在那个时候才被DataSource
实例化; BasicDataSource
commons-dbcp的实现会加载GenericObjectPool
该类,然后启动一个java.util.Timer
- Timer 启动一个
TimerThread
GC Root 并由 Web 应用程序类加载器加载。
定时器创建的堆栈跟踪
计时器显示为由 webapp 类加载器加载
我的第一个想法是让 TomcatDataSource
急切地初始化它,从而将它固定在通用类加载器中,但我发现没有办法这样做。我当然对解决这个问题的其他方法持开放态度(但 JNDI 绑定的资源需要保留)。
如何确保TimerThread
链接到 Web 应用程序类加载器?
java - 你如何列出在 jvm 中被内部化的字符串?
可能重复:
Java - 判断一个字符串是否被实习?
我想要一个已被 jvm 内部化的字符串列表,或者因为它们是字面的,是因为在它们上调用了方法intern 。我怎样才能生成它?
java - 除了 Class 对象,还有什么存储在 Perm Gen Space (sun 1.6 VM) 中?
我在运行 ~300 个 JUnit 测试并使用 Spring 上下文时看到“java.lang.OutOfMemoryError: PermGen space”。很难弄清楚是什么吞噬了 PermGen,因为:
- 在稳定状态下,应用程序消耗大约 90m 的 permgen 空间
- 我已经尝试过 -XX:MaxPermSize=256m 进行单元测试 - 仍然用完
-XX:+TraceClassLoading
启用和-XX:+TraceClassUnloading
启用后,在OutOfMemoryError
.
后者似乎表明除了 Class 对象之外的东西正在填充 PermGen,不是吗?如果是这样,那会是什么?例如,是否存在类实例存储在 PermGen 中的情况?
这是我的虚拟机信息:
有关的
FWIW,导致这篇文章的问题的根源结果有点微不足道:我假设 Maven Surefire 插件在分叉 VM 时从 MAVEN_OPTS(或运行 mvn 的 VM 实例)继承 VM 设置 -它没有(嘘)。必须在插件的配置中明确指定使用 argLine 的那些。HTH。
grails - Grails PermGem 错误
我需要帮助解决这个问题。我需要有人向我解释为什么会发生这种情况以及如何预防或避免它。
java - 为什么我只会看到 jmap -permstat 中的“死”类加载器(引导程序除外)?
我们一直在将应用程序中的 permgen 内存空间推得越来越高,我试图找出我们是否有某种泄漏进入 permgen 区域。我们不进行热取消部署/重新部署操作,但我们有很多代理,包括动态的和 CGLIB 生成的。我们还做了一些复杂的类加载器位来支持各种用例,我怀疑这些也可能导致 permgen 浪费。
所以我在我们正在运行的应用程序上运行 jmap -permstat,希望能够深入了解可能会填满我们的 permgen 空间的内容。(我还运行了一个包含活动对象和死对象的普通堆转储,以便我可以追踪可能来自 permstat 输出的线索)。
但是,在 jmap permstat 列出的 2400 个类加载器中,除了引导类加载器之外的所有类加载器都被列为“死”。这没有任何意义,因为该应用程序绝对是实时的,并且正在运行。
我的理解是,如果 jmap 有资格进行垃圾收集,jmap 会将类加载器报告为“死”,但我在这里一定是错的......
我错过了什么?这里的“死”是什么意思?除了我在这里可能存在的误解之外,谷歌搜索并没有提供很多答案。