tomcat 报“ Java .lang.OutOfMemoryError: PermGen space”如何才能知道内存占用问题

2019-07-23 22:09:36 +08:00
 iszengmh

tomcat 报“ java.lang.OutOfMemoryError: PermGen space ”、jconsole、visualvm、arthas 连接一直在加载,想排查一下是什么在占用内存,一直连接不了

1514 次点击
所在节点    程序员
6 条回复
chendy
2019-07-23 22:18:23 +08:00
一个笨方法:加 dump 参数,比如这样
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGDIR}/
然后把 dump 文件拉出来分析
Kahnn
2019-07-23 22:22:17 +08:00
连接不了是一直无响应,还是有报错?会不会是权限的原因
cheng6563
2019-07-23 22:24:24 +08:00
PermGen 存的是常量池之类的东西,是不是自定义了类加载器?或者是程序包太大了?

可以换到 Java8,Java8 没有专用 PermGen 内存了
iszengmh
2019-07-23 22:28:43 +08:00
@Kahnn 内存没有溢出之前,是有通过阿里的工具 arthas 连接过的,现在 arthas 也连接不了了
NerverLibis
2019-07-24 09:13:44 +08:00
我们的 java 告诉我是 mysql 挂了
lff0305
2019-07-24 12:08:18 +08:00
jmap dump 下内存,然后在 MAT 里面分析
或者
重启后挂上 jconsole, jprofiler,等等

个人经验,PermGen 冒了一般是程序里面通过反射不停的创建大量的类引起的,常见于各种反序列化的过程(比如 xml -> 对象)。可以通过 jconsole 的 loaded class 部分来跟踪

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/585589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX