V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iszengmh
V2EX  ›  程序员

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

  •  
  •   iszengmh · 2019-07-23 22:09:36 +08:00 · 1514 次点击
    这是一个创建于 1948 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    个人经验,PermGen 冒了一般是程序里面通过反射不停的创建大量的类引起的,常见于各种反序列化的过程(比如 xml -> 对象)。可以通过 jconsole 的 loaded class 部分来跟踪
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1211 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:12 · PVG 07:12 · LAX 15:12 · JFK 18:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.