当前位置:主页 > 查看内容

服务器上的Linux中Tomcat有时会挂掉的问题及方法

发布时间:2021-07-16 00:00| 位朋友查看

简介:正在启动的tomcat服务器,突然间挂掉,有时运行的好好的,分析了以下原因: 一、内存不足 本博主是在阿里云购买的云服务器,2G运行内存,开启了apache、tomcat服务器,剩余内存不足。 在开发当中,当一个项目比较大时,依赖的jar包通常比较多,我们都知道,……

正在启动的tomcat服务器,突然间挂掉,有时运行的好好的,分析了以下原因:

一、内存不足

本博主是在阿里云购买的云服务器,2G运行内存,开启了apache、tomcat服务器,剩余内存不足。
开发当中,当一个项目比较大时,依赖的jar包通常比较多,我们都知道,在应用服务器启动时,会将应用引用到的所有类通过ClassLoader依次全部加载到内存当中。Java的逻辑内存模型大致分为堆内存、栈内存、静态内存区,也称持久区,该区的内存不会被GC回收。堆内存用于存储类的实例、数组等引用类型数据,也就是用new生成的对象,都存放在这里,栈内存存储局部变量(如:方法参数),静态内存区存储常量、静态变量、类元数据信息(方法、属性等)。开发当中常遇到的三类内存溢出异常:
java.lang.OutOfMemoryError: Java heap space异常
表示堆内存空间满了,如果不是程序逻辑的bug,可能是因为项目中引用的jar比较多,导到内存溢出。JVM默认堆的最小使用内存为物理内存的1/64,最大使用内存为物理内存的1/4,如8G的物理内存,JVM默认堆的最小和最大内存分别为128m和2048m。通过调整JVM的-Xms(初始内存)和-Xmx(最大内存)两个参数加大内存使用限制。
java.lang.OutOfMemoryError: PermGen space异常
表示静态内存区满了,通常是由于加载的类过多导致。jdk8以下版本通过修改JVM的-XX:PermSize和-XX:MaxPermSize两个参数,限制静态区最小和最大内存范围。jdk8改变了内存模型,将类定义存放到了元数据(MetaspaceSize)空间,而元数据空间是与堆空间共享同一块内存区域的,所以在JDK8以后版本不会存在PermGen space异常了,故不用设置此参数。
java.lang.StackOverflowError异常
表示栈内存溢出。通常是由于死循环、无限递归导致。
系统会检测内存,如果内存占用过大,会自动清理进程。

二、服务器内存不足

主要配置Tomcat能处理的请求数,当一个进程的线程数超过500个的话,那么这个进程的运行效率就很低了。表面上看线程越多处理的请求越多,其实过多的线程会占用CPU在不同线程之间切换的资源,导致CPU在每个线程上处理的时间片极期有限,反而会降低服务器的响应性能。

三、解决方法

执行以下代码:

vim /var/log/messages

https://img-blog.csdnimg.cn/20200220131313294.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmcxMzU2Mzc1ODEyOA==,size_16,color_FFFFFF,t_70image.png
出现如图所示,就说明内存机制自动清除tomcat进程。内存不足产生溢出。

查看被kill的进程:

grep Kill /var/log/message*
3.1Tomcat内存优化

修改Tomcat的内存配置,打开$TOMCAT_HOME/bin/catalina.sh文件(Windows系统是catalina.bat文件),大楖在250行左右,在JAVA_OPTS参数上添加内存参数设置即可。完整的JVM参数设置如下所示:
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256 -Djava.awt.headless=true"
-server参数:表示以服务模式启动,启动速度会稍微慢一点,但性能会高很多。不加这个参数,默认是以客户端模式启动。
-Xms–Xmx JVM内存设置,建议设置成同一个值,可以在命令行中使用 java -Xmx1500m -version 来测试当前服务器可以设置的最大内存。(-Xmx 的值太大时,JVM 无法启动)。
-Xmn 年轻代 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m。
-Xss 是指设定每个线程的堆栈大小。一般不超过 1M。

3.2代码优化内存

通常是ThreadLocal方法出现内存泄漏,优化自己的功能。


本文转自网络,原文链接:https://developer.aliyun.com/article/785349
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐