阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux下 Tomcat内存溢出

166次阅读
没有评论

共计 2358 个字符,预计需要花费 6 分钟才能阅读完成。

Tomcat 本身不能直接在计算机上运行,需要依赖于操作系统和一个 Java 虚拟机。JAVA 程序启动时 JVM 会分配一个初始内存和最大内存给 APP。当 APP 需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。

一、常见的 Java 内存溢出有以下三种:
1. java.lang.OutOfMemoryError: Java heap space      即 JVM Heap 溢出
解释说明:JVM 在启动的时候会自动设置 JVM Heap 的值,JVM 堆的设置是指 java 程序运行过程中 JVM 可以调配使用的内存空间的设置。其初始空间默认是物理内存的 1 /64,最大空间不可超过物理内存。JVM 提供 -Xmn -Xms -Xmx 等选项来进行设置。

出错场景:在 JVM 中,如果 98%的时间是用于 GC,且可用的 Heap size 不足 2%时,将会出现 JVM Heap 溢出
解决方法:修改 JVM Heap 的大小。

2. java.lang.OutOfMemoryError: PermGen space        即 PermGen space 溢出。
解释说明:PermGen space 是指内存的永久保存区域。这个区域主要存放 Class 和 Meta 信息,Class 在被 Load 时就会被放入 PermGen space。

出错场景:如果 APP 载入很多 CLASS,就可能会出现 PermGen space 溢出。(因为 sun 的 GC 不会在程序运行时对 PermGen space 进行清理)。常见在 web 服务器对 JSP 进行 pre compile 的时候
解决方法:修改 MaxPermSize 大小

3. java.lang.StackOverflowError                    即栈溢出
解释说明:JVM 采用的是栈式的虚拟机,函数的调用过程都体现在堆栈和退栈上。

出错场景:通常栈的大小是 1-2MB 的,如果调用构造函数的“层”太多,则会出现栈溢出
解决方法:修改程序

二、Tomcat 的 JVM 内存溢出解决方法
在生产环境中,tomcat 内存设置不好很容易出现 JVM 内存溢,解决方法就是修改 Tomcat 中的 catalina.sh 文件。

在 catalina.sh 文件中,找到 cygwin=false,在这一行的前面加入参数,具体如下
# vi TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m”

其他说明:
1.“m”说明单位是 MB,否则默认是 KB
2. 一般使用物理内存的 80% 作为堆大小
3. 一般把 -Xms 和 -Xmx 设为一样大
4. 一般把 -Xmn 设置为 -Xmx 值的 1 /4
5. 一般将堆的总大小的 50% 到 60% 分配给新生成的池

三、jvm 参数说明:

-server                一定要作为第一个参数,启用 JDK 的 server 版本,在多个 CPU 时性能佳
-Xms                    java Heap 初始大小。默认是物理内存的 1 /64。
-Xmx                    java heap 最大值。建议均设为物理内存的 80%。不可超过物理内存。
-Xmn                    java heap 最小值,一般设置为 Xmx 的 3、4 分之一。
-XX:PermSize            设定内存的永久保存区初始大小,缺省值为 64M。
-XX:MaxPermSize        设定内存的永久保存区最大大小,缺省值为 64M。
-XX:SurvivorRatio=2    生还者池的大小,默认是 2。如果垃圾回收变成了瓶颈,您可以尝试定制生成池设置
-XX:NewSize            新生成的池的初始大小。缺省值为 2M。
-XX:MaxNewSize          新生成的池的最大大小。缺省值为 32M。
+XX:AggressiveHeap      让 jvm 忽略 Xmx 参数,疯狂地吃完一个 G 物理内存,再吃尽一个 G 的 swap。
-Xss                    每个线程的 Stack 大小
-verbose:gc            现实垃圾收集信息
-Xloggc:gc.log          指定垃圾收集日志文件
-XX:+UseParNewGC        缩短 minor 收集的时间
-XX:+UseConcMarkSweepGC 缩短 major 收集的时间
-XX:userParNewGC        可用来设置并行收集(多 CPU)
-XX:ParallelGCThreads  可用来增加并行度(多 CPU)
-XX:UseParallelGC      设置后可以使用并行清除收集器(多 CPU)

RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目  http://www.linuxidc.com/Linux/2015-02/113528.htm

Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签)  http://www.linuxidc.com/Linux/2015-02/113062.htm

Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm

Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm

CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm

CentOS 6.5 下安装 Tomcat  http://www.linuxidc.com/Linux/2015-01/111415.htm

Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计2358字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中