记录2023-03月 吐槽一下Tomcat内存溢出问题
记录2023-03月 吐槽一下Tomcat内存溢出问题
在2023年03月左右,我负责管理的Tomcat服务器出现了内存溢出异常,服务器为windows,Tomcat8,JDK8。
请求页面的时候效果如下图所示。

最开始我以为是Tomcat某个功能写到内存不足了,这台服务器本身做了初始化增加Xmx之类的配置调优,主要是Xms和Xmx,配置在catalina.bat之中。
-Xms:表示 Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存,导致性能大起大落,默认值为物理内存的 1/64,默认(MinHeapFreeRatio参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制。
-Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用 java -Xmx512M -version 命令来进行测试,然后逐渐的增大 512 的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的 1/4,默认(MinHeapFreeRatio参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到-Xms 的最小限制。
所以我觉得可能是某个功能查出了问题。后续检查出来某一个函数需要递归整个磁盘的文件夹,但是历史上这个功能并未出现任何问题。我开始对这次异常进行了怀疑。
我怀疑是不是有人动过服务器了?明明运行很久的服务器,配置项也仍然存在,为什么会突然内存不足。毕竟我查看了windows本身的服务器管理程序,发现当前服务器的内存使用量是很低的。
所以单纯的是程序的内存不足,却不是服务器的内存不足,程序的内存又是调优过的,那么还能改哪里?
纠结了几个小时,出门抽了好几颗烟,突然想到,会不会有人莫名其妙去改一下注册表之中的信息?这系统运行好几年了,不应该有人手欠去改注册表吧?
本台服务器上一共配置了5台tomcat,其中另外两台的注册表竟然和第3台的不一样,简直想骂人。
第一台注册表信息如下所示。

结果第二台和第三台服务器这里被改成了125和268,毕竟三台服务器改了两台,怎么可能是最开始配置的问题?虽然最开始不是我配置的,但是不可能有人配置服务器改了3台服务器的初始化内存,少改两台服务器的初始化内存吧?
另外值得一提的是,这个regedit是窗口一直打开在服务器桌面上的,最开始没注意,结果发现一直是打开状态,并且目录就是Java这两行。
吐槽一下,真不知道谁为什么会这么干活?改一个运行很久的服务器的注册表,最后还不通知别人。幸亏灵机一动想到了注册表这事,不然不一定搞多久了。
地址:
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Apache Software Foundation/Procrun 2.0 /dataService/report11