设置的方法在下文~
问题背景
近日,负责的项目在正式环境内,对大数据量导出为Excel进行操作时,表现得异常卡顿,经常出现500连接超时、内存溢出等异常。
最初技术组认为是代码需要进行优化,将原本的导出代码copy了一份后,修改为达到限制的导出上限就分为另一个Excel,最后以ZIP压缩包的形式进行导出。
再半天的编码后,晚上发布至正式环境的测试系统进行测试时,发现问题依旧!瞬间wtf...
解决方案
最后在修改Tomcat的环境内存,解决了相关的问题。
在查询资料和系统测试的过程中找到了一些有趣的内容:
Tomcat 内存,最小堆大小为物理内存的1/16,最大堆大小为物理内存的1/4.......
client模式下,JVM初始和最大堆大小为:
在物理内存达到192MB之前,JVM最大堆大小为物理内存的一半,否则,在物理内存大于192MB,在到达1GB之前,JVM最大堆大小为物理内存的1/4,大于1GB的物理内存也按1GB计算,举个例子,如果你的电脑内存是128MB,那么最大堆大小就是64MB,如果你的物理内存大于或等于1GB,那么最大堆大小为256MB。
Java初始堆大小是物理内存的1/64,但最小是8MB。server模式下:
与client模式类似,区别就是默认值可以更大,比如在32位JVM下,如果物理内存在4G或更高,最大堆大小可以提升至1GB,,如果是在64位JVM下,如果物理内存在128GB或更高,最大堆大小可以提升至32GB。
Tomcat的Xms内存与Xmx内存建议设置为相同的数值,避免造成瞬间GC
GC,即异常 java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread thread_name: java.lang.OutOfMemoryError: GC Overhead limit exceeded
Cause: The detail message "GC overhead limit exceeded" indicates that the garbage collector is running all the time and Java program is making very slow progress. After a garbage collection, if the Java process is spending more than approximately 98% of its time doing garbage collection and if it is recovering less than 2% of the heap and has been doing so far the last 5 (compile time constant) consecutive garbage collections, then a java.lang.OutOfMemoryError is thrown. This exception is typically thrown because the amount of live data barely fits into the Java heap having little free space for new allocations.
Action: Increase the heap size. The java.lang.OutOfMemoryError exception for GC Overhead limit exceeded can be turned off with the command line flag -XX:-UseGCOverheadLimit.大致意思是,JVM花费了98%的时间进行垃圾回收,但是只从系统得到2%可用的内存,频繁的进行内存回收,期间最起码已经进行了5次连续的垃圾回收,JVM就会曝出ava.lang.OutOfMemoryError: GC overhead limit exceeded的异常。
Tomcat配置成Windows Service服务后,内存的配置并非是常规命令行在catalina.bat内配置的内存,涨姿势了……
Tomcat 设置内存
startup命令行启动方式
打开在Tomcat的bin文件夹下的catalina.bat(linux系统为catalina.sh),输入下方的设置信息:
JAVA_OPTS=-Xms[初始化内存大小] -Xmx[可以使用的最大内存]
例如JAVA_OPTS=-Xms4069 -Xmx4069,注意事项:
- -Xms、-Xmx后直接跟数字,不需要空格。
- =后面不需要任何英文引号('),之前组里的小伙子在查找csdn博客内的教程时加上了英文引号(')导致配置没有正确执行...
- 在catalina.bat(或.sh文件)可直接写在开头@echo off之后。
设置完毕后重启Tomcat即可。
Windows Service 系统服务的启动方式
首先,我们需要在cmd.exe内切换到Tomcat的bin文件夹,之后执行下方命令创建服务
service.bat install 服务名
OK,很多人(包括一脸懵的我)在创建后就认为万事大吉,殊不知Service内存的配置与上一个方法不共享。
这时候,我们打开regedit注册表工具,按下方的路径找到配置“JvmMs”和“JvmMx”
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\[你创建的服务名]\Parameters\Java
分别双击这两个配置,对内存值进行修改。(PS:这里建议点击decimal十进制的方式进行录入)
都设置ok之后,在services.msc服务窗口内重启项目即可!
以上内容就是Tomcat设置内存的两种方法了,谢谢你的浏览!🌹