为何Tomcat进程内存远高于堆上限,堆转储后内存会大幅下降?
问题根因说明
为什么Tomcat进程内存远高于设置的JVM最大堆值
JVM进程的内存占用从来不是只有堆内存这一块,你配置的50GB-Xmx只是Java对象堆的上限,剩下超出的部分全是堆外、JVM自身运行必须的内存,在你这种高吞吐、对象每秒创建销毁量级极大的场景下,这部分内存占比会高得超出很多人的预期:
- 元空间:Java11已经移除了永久代,类元信息、运行时常量池、动态生成的类字节码全存在元空间,默认元空间没有硬上限。高流量Web场景下大量JSP动态编译、反射动态代理、字节码增强生成的类会持续占用元空间,长期运行下攒到几个GB很常见。
- 直接内存:Tomcat的NIO连接器、Web框架、序列化/反序列化组件都会大量使用NIO的
DirectByteBuffer申请堆外内存,这部分内存完全不受-Xmx管控,默认上限和宿主机可用内存挂钩。而且直接内存的回收依赖老年代GC触发,你现在每分钟多次GC、单次回收10-15GB堆对象的高压力场景下,直接内存的回收速度很容易跟不上分配速度,慢慢就会累积出很高的占用。 - 线程栈与JIT缓存:Tomcat线程池在高流量下通常会维持数百到上千的工作线程,每个线程默认占1MB栈空间,加起来就是几个GB的占用;JIT编译器把热点字节码编译成本地代码的缓存,也会占数百MB到数GB不等的内存。
- GC自身的原生内存开销:Java11默认用G1收集器,在50GB这种大堆、对象分配速率极高的场景下,GC维护的记忆集、卡表、标记位图、对象遍历临时结构都会占大量内存,极端情况下这部分开销能到堆大小的50%以上。你每次GC要处理10-15GB的待回收对象,这部分临时数据长期累积不释放,是内存超支的核心原因之一。
- Windows系统的内存统计特性:Windows Server 2012的任务管理器统计的“提交内存”,会把JVM向系统申请后预留、但实际没有存任何有效数据的内存页全算进去。JVM默认是惰性归还内存的——GC回收出来的空闲内存会先留在JVM自己的内存池里备着下次分配对象用,不会立刻还给操作系统,这部分“占着坑没放东西”的内存,会让你看到的提交内存比实际使用值高很多。
为什么执行jmap堆转储后释放了大量内存,但堆内存指标没有变化
这里首先纠正一个常见误解:你执行的不带live参数的jmap -dump确实会触发STW全局停顿,但这一次回收的根本不是堆里的存活对象,jconsole里堆占用指标没变化是完全正常的——因为堆里的存活对象总量本来就没变,掉下去的28GB全是JVM之前攥在手里没还给OS的空闲内存、以及GC残留的临时内存:
- 堆转储触发的STW阶段,JVM会做一次全量内存规整:首先会把堆里的存活对象全部紧凑移动到内存块的一端,把之前零散分布的空闲内存合并成连续的大段空区。这部分空区本来就在堆的50GB上限范围内,只是之前被碎片化了,jconsole统计的堆占用是存活对象占堆总容量的比例,所以整理前后数值不会有任何变化。
- STW阶段JVM会把所有没必要保留的原生内存一次性释放干净:包括之前多轮GC残留的临时标记数据、冗余的记忆集碎片、已经没有引用指向的直接内存块、JIT编译产生的临时缓存,这些内存之前因为JVM的惰性回收策略一直没归还给系统,在全局停顿没有业务线程运行的状态下,会被全部清理掉。
- 堆转储的内存盘点流程里,JVM会把堆内整理出来的大段连续空闲内存、非堆区域的冗余预留内存,批量归还给Windows系统,这就是你看到提交内存从84GB掉到56GB的核心原因——这28GB内存本来就没有被任何有效对象占用,只是之前JVM一直没还给系统而已。
可落地的优化方案
- 给非堆内存加上硬上限:通过
-XX:MaxMetaspaceSize=1G给元空间设1GB上限,通过-XX:MaxDirectMemorySize=15G给直接内存设上限,避免非堆内存无限制增长。 - 调整JVM内存归还策略:加上
-XX:MinHeapFreeRatio=20、-XX:MaxHeapFreeRatio=30参数,让JVM在堆空闲占比过高时主动把空闲内存还给OS,配合-XX:G1PeriodicGCInterval=300000每5分钟触发一次周期性GC,清理累积的堆外内存。 - 生产环境抓堆转储时记得加
live参数,用jmap -dump:live,file=<heap-file-name> <pid>命令,这样抓到的转储只包含存活对象,文件体积更小,也不会触发无意义的全内存扫描。 - 大堆Java应用尽量不要跑在Windows Server 2012这类老旧系统上,Windows的内存管理机制和JVM的适配性远不如Linux,很容易出现预留内存长期无法归还、内存统计偏差大的问题。
内容的提问来源于stack exchange,提问作者user3501885
相关产品推荐
相关产品推荐

