随着系统并发量越来越高,Tomcat 所占用的内存就会越来越大,如果对 Tomcat 的内存管理不当,则可能会引发 Tomcat 内存溢出的问题,那么,如何防止 Tomcat 内存溢出呢?我们今天就来一起探讨下这个问题。

防止 Tomcat 内存溢出可以总结为两个方案:一个是设置 Tomcat 启动的初始内存,一个是防止 Tomcat 所用的 JVM 内存溢出。接下来,我们就分别对这两种方案作出简单的介绍。

设置启动初始内存

其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。可以利用 JVM 提供的-Xmn -Xms -Xmx 等选项可进行设置。

实例

以下给出 1G 内存环境下 java jvm 的参数设置参考:

JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"

复制代码

Linux

在/usr/local/apache-tomcat-7.0/bin 目录下的 catalina.sh 文件中,添加:JAVA_OPTS='-Xms512m -Xmx1024m',要加“m”说明是 MB,否则就是 KB 了,在启动 tomcat 时会报内存不足。

  • -Xms:初始值

  • -Xmx:最大值

  • -Xmn:最小值

Windows

在 catalina.bat 最前面加入 set JAVA_OPTS=-Xms128m -Xmx350m,如果用 startup.bat 启动 tomcat,OK 设置生效。够成功的分配 200M 内存。但是如果不是执行 startup.bat 启动 tomcat 而是利用 windows 的系统服务启动 tomcat 服务,上面的设置就不生效了,就是说 set JAVA_OPTS=-Xms128m -Xmx350m 没起作用。上面分配 200M 内存就 OOM 了。。windows 服务执行的是 bin\tomcat.exe。它读取注册表中的值,而不是 catalina.bat 的设置。

解决办法

修改注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions

复制代码

原值为

-Dcatalina.home="C:\ApacheGroup\Tomcat 7.0"-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 7.0\common\endorsed"-Xrs

复制代码

加入 -Xms300m -Xmx350m 重起 tomcat 服务,设置生效。

防止所用的 JVM 内存溢出

1.java.lang.OutOfMemoryError: Java heap space

解释

Heap size 设置

JVM 堆的设置是指 java 程序运行过程中 JVM 可以调配使用的内存空间的设置.JVM 在启动的时候会自动设置 Heap size 的值,其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)是物理内存的 1/4。可以利用 JVM 提供的-Xmn -Xms -Xmx 等选项可进行设置。Heap size 的大小是 Young Generation 和 Tenured Generaion 之和。

提示:在 JVM 中如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出此异常信息。

提示:Heap Size 最大不要超过可用物理内存的 80%,一般的要将-Xms 和-Xmx 选项设置为相同,而-Xmn 为 1/4 的-Xmx 值。

解决方法

手动设置 Heap size

修改 TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下代码。

set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m  set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m

复制代码

或修改 catalina.sh

在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

复制代码

2.java.lang.OutOfMemoryError: PermGen space

原因

PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域,这块内存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 时就会被放到 PermGen space 中,它和存放类实例(Instance)的 Heap 区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space 进行清理,所以如果你的应用中有很 CLASS 的话,就很可能出现 PermGen space 错误,这种错误常见在 web 服务器对 JSP 进行 pre compile 的时候。如果你的 WEB APP 下都用了大量的第三方 jar, 其大小超过了 jvm 默认的大小(4M)那么就会产生此错误信息了。

解决方法

手动设置 MaxPermSize 大小

修改 TOMCAT_HOME/bin/catalina.bat(Linux 下为 catalina.sh),在代码“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m  

复制代码

“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

复制代码

catalina.sh 文件的修改如下。

Java 代码

JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m" 

复制代码

3.分析 java.lang.OutOfMemoryError: PermGen space

发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致 JVM 中的 permanent heap 溢出 。然后解决方法众说纷纭,有人说升级 tomcat 版本到最新甚至干脆不用 tomcat。还有人怀疑 spring 的问题,在 spring 论坛上讨论很激烈,因为 spring 在 AOP 时使用 CBLIB 会动态产生很多类。

但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat 在 Q&A 很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生。

于是有人对更基础的 JVM 做了检查,发现了问题的关键。原来 SUN 的 JVM 把内存分了不同的区,其中一个就是 permenter 区用来存放用得非常多的类和类描述。本来 SUN 设计的时候认为这个区域在 JVM 启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc 根本没办法回收!

对于以上两个问题,我的处理是:

在 catalina.bat 的第一行增加:

set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

复制代码

在 catalina.sh 的第一行增加:

JAVA_OPTS= -Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 

复制代码

写在最后

如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

【高并发】高并发环境下如何防止 Tomcat 内存溢出?一文让你看懂!!相关推荐

  1. oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...

    [高并发]高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 发布时间:2020-04-19 00:47, 浏览次数:126 , 标签: Tomcat 写在前面 随着系统并发量越来越高,Tomc ...

  2. div固定大小文字溢出自动缩小_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!

    写在前面 随着系统并发量越来越高,Tomcat所占用的内存就会越来越大,如果对Tomcat的内存管理不当,则可能会引发Tomcat内存溢出的问题,那么,如何防止Tomcat内存溢出呢?我们今天就来一起 ...

  3. 解决eclipse环境下maven项目tomcat启动,未加载到项目的问题

    解决eclipse环境下maven项目tomcat启动,未加载到项目的问题 参考文章: (1)解决eclipse环境下maven项目tomcat启动,未加载到项目的问题 (2)https://www. ...

  4. eclipse环境下如何配置tomcat

    eclipse环境下如何配置tomcat 回到目录 eclipse环境下如何配置tomcat 很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此 ...

  5. Linux NetCore下Pdf转图片 内存溢出

    Linux NetCore下Pdf转图片 内存溢出 Linux PDF转图片异常 查看libgdiplus版本 解决方案 NetCore 3.1下面调用Pdf转图片的组件,在本地windows环境下转 ...

  6. 高并发环境下如何优化Tomcat性能?看完我懂了!

    来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...

  7. tomcat 请求超时_高并发环境下如何优化Tomcat性能?看完我懂了!

    来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...

  8. Docker环境下Spring Boot应用内存飙升分析与解决

    目录 Spring Boot应用内存飙升 服务现状 JVM默认内存设置 优化 限制JVM内存 参数解释 JVM常见参数 java.security.egd 作用 优化后的Dockerfile文件 优化 ...

  9. LPC1768 IAR环境下使用完整64K内存的方法_整理

    https://blog.csdn.net/tpoem/article/details/98372896 原文有一点错误 这个芯片是NXP公司出的很经典的一款Cortex-M3芯片了 虽然已经过了很多 ...

  10. LPC1768 IAR环境下使用完整64K内存的方法

    这个芯片是NXP公司出的很经典的一款Cortex-M3芯片了 虽然已经过了很多年了,但是依然还有很多地方在用着 这个芯片有一个很不方便的地方 它的64K内存不是连续的! USB和片上以太网MAC各用了 ...

最新文章

  1. 6 款 Java 8 自带工具,轻松分析定位 JVM 问题!
  2. 1012 数字分类 (20 分)(c语言)
  3. IOS 学习笔记 2015-03-24 OC-API-常用结构体
  4. [vue] v-once的使用场景有哪些?
  5. JAVA快速排序算法实现
  6. CXF WebService整合SpringMVC的maven项目
  7. 解决 Error: Table './db_name/table_name' is marked as crashed and last (automatic?) repair
  8. can't find which disk is full
  9. python寻峰,寻找峰值
  10. pg 备份恢复(四)—— 逻辑备份(dump与copy导入导出)
  11. 斐波那契数列c语言while,C语言数据结构递归之斐波那契数列
  12. 一文搞懂如何兼容苹果HomeKit?智汀助你轻松打造智慧家庭
  13. 关于mysql优化的文章
  14. 大数据助力普惠金融发展
  15. 人脸检测论文:FaceBoxes: A CPU Real-time Face Detector with High Accuracy及其Pytorch实现
  16. Matlab——常用函数的用法总结(部分直接摘自mathwork,持续更新)
  17. IT资产管理系统Snipe-IT使用docker安装记录
  18. Wechaty|不使用微信的web协议的机器人
  19. 【开发教程14】AI语音人脸识别(会议记录仪/人脸打卡机)-AI人脸系统架构
  20. 2019 年百度之星·程序设计大赛 - 初赛一 解题报告

热门文章

  1. Java 操作Word书签(二):添加文本、图片、表格到书签内容
  2. 微信公众号+web后台的工资条发放功能的实现
  3. Hive之窗口函数(一文搞懂)
  4. Word VBA 绘制直尺
  5. 信号处理 | 维纳滤波推导
  6. 51单片机初学3-从零开始制作一款电子时钟
  7. RS485协议详解RS485与RS232优缺点比较
  8. 关于html 音乐播放器代码|音乐播放器网页代码大全(转),关于HTML 音乐播放器代码|音乐播放器网页代码大全...
  9. 学习笔记(11):ArcGIS10.X入门实战视频教程(GIS思维)-快速制作一幅土地利用现状图(引入制图表达)
  10. MFC TeeChart 用法整理二