请教 Java OOM 及 JVM 相关的问题

查看 91|回复 7
作者:superhot   
背景
[ol]
  • AWS EC2 t3.medium 实例,Amazon Linux 2 系统,4GB 内存。
  • Java 启动时 Heap 的配置为 -Xmx2847m,大概是给其他服务留 1G 左右内存,其余全部分配给 JVM 。
  • 结合日志和后台监控发现频繁出现 OOM 导致 Tomcat 重启的问题。
    [/ol]
    问题
    [ol]
  • 现在每个实例的平均内存使用率在 93% 左右,此现象是否正常?
  • 保持当前 EC2 实例配置不变的情况下,给 JVM Heap 分配多大内存比较合适?有什么可以拿来当作判断的依据吗?
  • 除了 Heap 之外,JVM 还有 Metaspace 、CodeCache 、DirectByteBuffers 等等,这些 Heap 之外的部分可能吃掉多少内存?有什么可以拿来当作判断的依据吗?
  • 如何分析 OOM 可能的情况?/usr/share/tomcat 目录下有个 hs_err_pid 前缀的日志文件,似乎在 OOM 时会输出相关错误信息,但根本看不懂……
    [/ol]
    一年后端经验的 CRUD Boy 没系统学过 Java ,不了解 JVM ,突然让去解决 OOM 的问题,实在懵逼,不知从何下手,请各位 Java 大佬们给点建议,救救本菜,谢谢大家!
  • BBCCBB   
    堆内内存的话, dump 一份内存下来看占用内存的都是什么东西.
    2Nfree   
    可以用 JVM 参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump 导出 OOM 时的 heap dump ,然后用工具分析,或者直接在应用程序运行的时候使用 jmap 导出当前对象分布的情况进行分析,推荐用这个: https://arthas.aliyun.com/doc/
    INCerry   
    什么版本的 Java ?如果版本高只想解决问题,那先:
    -XX:+UnlockExperimentalVMOptions
    -XX:+UseShenandoahGC
    -XX:ShenandoahGCHeuristics=compact
    Geekerstar   
    把这个 hs_err_pid 日志发出来,我最近也遇到 OOM 了,能帮忙排查下。可以看我最近发的一个帖子。
    defunct9   
    升级 ec2 ,给 8G 内存
    wenning   
    springboot 的话加上 actuator, 配合 prometheus, grafana 看看 jvm 相关的使用情况; 90%的占用肯定不正常了, 相当于比较吃紧了, 如果来点压力就挂了, 再留一点内存给系统, 否则内存满了直接会被系统 kill
    ZZ74   
    现在每个实例的平均内存使用率在 93% 左右,此现象是否正常? 正常。
    参考这个帖子 /t/1078482?p=1#reply22 贴出 hs_err_pid 内容。贴给 AI 都会给你分析。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部