V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
iszengmh
V2EX  ›  程序员

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

  •  
  •   iszengmh · Jul 23, 2019 · 1890 views
    This topic created in 2469 days ago, the information mentioned may be changed or developed.

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

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

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

    个人经验,PermGen 冒了一般是程序里面通过反射不停的创建大量的类引起的,常见于各种反序列化的过程(比如 xml -> 对象)。可以通过 jconsole 的 loaded class 部分来跟踪
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4715 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 10:06 · PVG 18:06 · LAX 03:06 · JFK 06:06
    ♥ Do have faith in what you're doing.