2025-07-12 10:41:03
昨天刚给服务器进行JVM内存压榨,今天就报OOM堆内存溢出异常了orz,看来100MB还是无法满足博客的稳定运行~
服务报错OOM
压榨的有点太狠了点,导致博客服务崩溃的原因大致上分析是(JVM环境java8) :
新申请堆空间数据 -> 压满新生代eden区域-> Minor GC 年轻代回收内存 -> 进入survivor -> 老年代 -> Major/Full GC 老年代回收内存 -> 尝试分配 -> OOM 。
网上找的JVM内存结构图
当然暂且还不确定是不是正常的装载数据溢出还是有内存泄露,后续做下JVM监控。现在就先简单扩大下Xmx堆空间大小到150MB了。
目前系统上很大一部分服务是做的JAVA微服务,不同的领域单独成一个微型服务运行。昨天通过arthas对每个java程序进行了简单的内存分析(dashboard、jvm、memory),得知现在JAVA服务的元数据区(metaspace)是占用大头,毕竟有很多类要装载,只能说微服务在这种内存局促的场景下还是有点劣势的,唯一的优势大抵上就是——可选择性关闭部分服务 以及 不会出现一崩百崩的局面?但是不同模块重复装载元数据的冗余内存占用目前在HotSpot架构JVM虚拟机属实无解,当然其他厂商的应该也无法实现,毕竟如果真的要管理,就要进行进程内存共享操作了,会涉及到严重的进程安全问题。
以上就是本次突发状况的总结,以便后续翻看参考故而撰写此文。
(不过有一说一,一个2GB的服务器,跑起来十多个服务已经算是奇迹了吧在(⌐■_■),更何况windows系统本身就占用了近1GB,余下我操作的空间只有1GB)