OOM解决和性能调优


前言

新接手一个项目,扎眼一看,源码加各种依赖Jar一起接近一个G,不太妙。还是先把项目跑起来吧。打开项目发现还是 Eclipse 的项目,可我早就是 Idea 党了。一顿操作后终于还是在Idea中跑起来了这个项目,但是项目加载到一半就报出一个错误 java.lang.OutOfMemoryError: PermGen space。一看就知道是OOM了,默认的内存大小竟然还跑不动这项目。

Tomcat内存调整

1.在Idea中调整

在Idea中编辑配置在VM options填入 -server -Xms2048m -Xmx4096m -XX:MaxNewSize=2048m -XX:MaxPermSize=4096m
解析:https://zhuanlan.zhihu.com/p/43158214
TT34ja

2.在Tomcat配置文件中调整

修改 Tomcat 的内存配置,打开 $TOMCAT_HOME/bin/catalina.sh 文件( Windows 系统是 catalina.bat 文件)
Linuxcygwin=false 前加上 JAVA_OPTS="-server -Xms2048m -Xmx4096m -XX:MaxNewSize=2048m -XX:MaxPermSize=4096m",Windows 在第一行加。

Tomcat调优

项目是跑起来了,既然都调整内存了,那就干脆把 Tomcat 的调优参数一块看一下吧。

JVM调整

-server 参数:表示以服务模式启动,启动速度会稍微慢一点,但性能会高很多。不加这个参数,默认是以客户端模式启动。
java.awt.headless=true 参数:与图形操作有关,适用于linux系统。如生成验证码,含义是当前使用的是没有安装图安装图形界面的服务器,应用中如果获取系统显示有关参数会抛异常。
-XX:PermSize 设置永久代初始值,默认是物理内存的1/64。java1.8以后不起作用了,改成了元空间,对应参数 -XX:MetaspaceSize
-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize ,最大空间,默认是没有限制的。
XX:MaxPermSize 设置最大非堆内存的大小,默认是物理内存的1/4。java1.8以后不起作用了,改成了元空间,对应参数 -XX:MaxMetaspaceSize -Xms、-Xmx:JVM内存设置(堆内存)。
ps:这两组最好设置成一样的,避免上下文切换消耗资源。JDK8+永久代已经换成了元空间,PermSize MaxPermSize这两个参数没用了。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path oom时打印dump文件到指定路径

server.xml修改

<Connector
port="8080"  
protocol="org.apache.coyote.http11.Http11NioProtocol" 
enableLookups="false"            
maxThreads="1000"               
minSpareThreads="100"                            
acceptCount="5000"               
disableUploadTimeout="true"              
connectionTimeout="30000"               
URIEncoding="UTF-8"                           
redirectPort="8443"               
compression="on"              
compressionMinSize="1024" 
useSendfile="false"
noCompressionUserAgents="gozilla, traviata"            
compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript "   />

org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio
maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。
minSpareThreads:最小空闲线程数。
acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
disableUploadTimeout:禁用上传超时时间
connectionTimeout:连接超时,单位毫秒,0代表不限制
URIEncoding:URI地址编码使用UTF-8
enableLookups:关闭dns解析,提高响应时间
compression:启用压缩功能
compressionMinSize:最小压缩大小,单位Byte
compressibleMimeType:压缩的文件类型

总结

遇到问题可以先去官网看看,一般官网都有文档和详细的介绍Tomcat参数官网 http://tomcat.apache.org/tomcat-9.0-doc/config/http.html


文章作者: Una
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Una !
  目录