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

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

发布时间:2020-04-19 00:47,

浏览次数:126

, 标签:

Tomcat

写在前面

随着系统并发量越来越高,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

写在最后

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[JSOI2008]最小生成树计数

OJ题号:  BZOJ1016 题目大意:   给定一个无向带权图,求最小生成树的个数。 思路:   先跑一遍最小生成树,统计相同权值的边出现的个数。   易证不同的最小生成树,它们不同的那一部分边的权值实际上是…

vuex webpack 配置_vue+webpack切换环境和打包之后服务器配置

import axios from ‘axios‘import store from ‘../store/index‘const rootUrl process.env.API_ROOT//创建axios实例const service axios.create({timeout:30000 //超时时间})//添加request拦截器service.interceptors.request.use(config >{if (Object.keys(config.hea…

redis基本用法学习(C#调用FreeRedis操作redis)

FreeRedis属于常用的基于.net的redis客户端,EasyCaching中也提供适配FreeRedis的包。根据参考文献4中的说法,FreeRedis和CsRedis算是近亲(都是GitHub中账号为2881099下的开源项目),因此其用法特别相似。FreeRedis的主要…

opencv:图像的基本变换

0.概述 图像变换的基本原理都是找到原图和目标图的像素位置的映射关系,这个可以用坐标系来思考,在opencv中, 图像的坐标系是从左上角开始(0,0),向右是x增加方向(cols),向下时y增加方向(rows)。 普通坐标关系&#xff1…

FFMpeg在Windows环境下的编译

1.安装MinGW (1)下载文件:MinGW-5.1.4.exe, (2)安装时选择下列组件: binutils-2.19.1-mingw32-bin.tar.gz gcc-core-3.4.5-20060117-3.tar.gz gcc-g-3.4.5-20060117-3.tar.gz …

中通知设置响铃_主动切断干扰源——手机“通知”精细化管理

上周去参加我福福幼儿园的母亲节活动,内容是孩子和家长一起穿手链。期间我发现和我同桌的一个家长的手机不停在响,当然伴随着注意力被打断。不仅是这位家长自己,连我也受到了干扰。于是职业病又犯了,我悄悄的看了一眼这位家长的手…

OCM_第十九天课程:Section9 —》Data Guard _ DATA GUARD 原理/DATA GUARD 应用/DATA GUARD 搭建...

注:本文为原著(其内容来自 腾科教育培训课堂)。阅读本文注意事项如下:1:所有文章的转载请标注本文出处。2:本文非本人不得用于商业用途。违者将承当相应法律责任。3:该系列文章目录列表&#xf…

python安装各种插件

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pip 感受:如果编辑pip真的一直出问题,考虑降成32位的进行安装。毕竟合理搭配比木桶突出有用。转载于:https://www.cnblogs.com/osmondwang/p/7307678.html

编写数学公式的好工具

2019独角兽企业重金招聘Python工程师标准>>> http://private.codecogs.com/latex/eqneditor.php 转载于:https://my.oschina.net/yizhichao/blog/1542153

dev gridview 打印列数过多_R语言:如何将多张统计图绘制在一张上面

在使用R语言进行数据可视化的时候,常常需要将多张统计图表绘制在同一张图上面,从而更高效地传递信息,下面我们就来一起看看具体如何实现。一、使用R语言自带的函数绘制的图像R语言本身就已经内置了许多绘图函数,能够满足较为基本的…

264分析两大利器 和 视频系列下载:264VISA和Elecard StreamEye Tools

学了264有将近3个月有余,好多时候都在学习老毕的书和反复看JM86的代码,最近才找到264分析两大利器:264VISA和Elecard StreamEye Tools。不由得感叹,恨不逢同时。 简单的说下这两个软件: 264visa 强力的h264实时分析工具…

[转]vue全面介绍--全家桶、项目实例

慢慢了解vue及其全家桶的过程 原文http://blog.csdn.net/zhenghao35791/article/details/67639415 简介 “简单却不失优雅,小巧而不乏大匠”。 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angular.js和R…

opencv 星空_opencv如何将大于5000像素点的轮廓绘制出来?

contourArea函数的运用。具体例子可以看下面的。《如何获得物体的主要方向?》代码略解:1、读入图片,寻找轮廓;//读入图像,转换为灰度Mat img imread("e:/sandbox/pca1.jpg");Mat bw;cvtColor(img, bw, COLO…

TS 188字节流结构图

应该说真正了解TS,还是看了朋友推荐的《数字电视业务信息及其编码》一书之后,MPEG2 TS和数字电视是紧密不可分割的,值得总结一下其中的一些关系。 ISO/IEC-13818-1:系统部分; ISO/IEC&#xff…

二进制安装mysql 5.7、mariadb (附yum安装方式)

前言:本文以mariadb为例进行讲解,安装mysql同理,并以通过测试。安装前查找系统已安装的相关包(rpm -qa|grep -e "mysql" -e "mariadb")并进行卸载。1、准备mariadb存储数据库文件的目录。mkdir -p…

GLSL/C++ 实现滤镜效果

入门效果之浮雕 "浮雕"图象效果是指图像的前景前向凸出背景。常见于一些纪念碑的雕刻上。要实现浮雕事实上很easy。我们把图象的一个象素和左上方的象素进行求差运算。并加上一个灰度。这个灰度就是表示背景颜色。这里我们设置这个插值为128 (图象RGB的值是0-255)。同…

cv mat的shape_pybind11—opencv图像处理(numpy数据交换)

前言C opencv中图像和矩阵的表示采用Mat类,比如imread()读取的结果就是返回一个Mat对象。对于python而言,numpy 通常用于矩阵运算, 矩阵,图像表示为numpy.ndarray类。因此,想要将python numpy.ndarray的数据传递到C op…

H.264算法的优化策略

文章来源: http://www.tichinese.com/Article/Video/200909/2150.html 编辑:小乙哥 1 代码优化的主要方法 通过代码移植能够获得在DSP上初步运行的代码,但是它由于没有考虑到DSP自身的硬件特点,不适合DSP强大的并行处理能力&#…

吃饭、睡觉、打星星之“打星星”!

大家见过这样的星星么? 你想要多少就可以多少的星星!!! 下面我们就来用奇妙的JavaScript来实现 首先我们要引入一个输入包 let readline require("readline-sync");然后再让客户输入数字,并将其存放起来con…

mysql 自动分表_Mysql Event 自动分表

create table TempComments Like dycomments;上述 SQL语句创建的新表带有原表的所有属性,主键,索引等。自动分表怎么做呢?使用上述语句自动创建分表。那么ID怎么设置呢?更改表格自增主键的起始值 例如 表格为 xxx_201604 那么将起…