【发布时间】:2011-04-20 19:57:52
【问题描述】:
我在 Sun JVM (1.6.0_21-b06) 上遇到 PermGen 空间错误(好的,它是 Oracle :))。增加选项 -XX:MaxPermGen 值没有帮助。我知道 PermGen 是一个用于存储类元数据等永久对象的空间。项目中的类数不是那么大 ~ 10 000。在崩溃之前 jvisualvm 显示 57MB 作为 Used PermGen。
我猜有些算法会占用所有可访问的内存。有人知道导致 PermGen 溢出的算法示例吗?
UPD. 我问了这么抽象的问题,因为此刻我无法使用任何分析器 - 代码崩溃如此严重以至于 jvisualvm 和 eclipse 停止响应。我需要使用 kill -KILL {process_numer} 从终端杀死 Java 进程。我使用具有许多线程和 JMS 消息传递的组织不良(但商业化)的代码。调试是一团糟——我首先需要知道在哪里查看。
【问题讨论】:
-
你的问题的抽象级别杀死了;)。使用 Java 分析器(例如 virtualvm)找出程序崩溃的原因。如果您发现问题,请重写您的问题。
-
出于好奇,您能否显示您正在使用的确切命令行选项?
-
通过了解导致 PermGen 溢出的代码示例,您将获得什么?你是想欣赏一个问题,然后从欣赏中制造问题,还是试图解决它?这种解决问题的方法我见过很多次了,最好找根因解决。像 Skarab 建议使用 Java 分析器。了解您是研究人员还是学生,但看起来不像。
-
@Nulldevice 我看到你注意到 jms 消息。我遇到了与 JMS 相关的类似问题,请检查您的 jms 连接是否已关闭。在下面查看我的答案,它有更多详细信息。
-
要提供更具建设性的反馈 - 请尝试eclipse.org/proposals/memory-analyzer。它是一个java转储内存分析器。在发生意外错误后非常有用。
标签: java heap-memory