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

028903e10796400b2ce8263eb33b5d97.png

写在前面

随着系统并发量越来越高,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服务执行的是bintomcat.exe。它读取注册表中的值,而不是catalina.bat的设置。

解决办法

修改注册表

HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationTomcat Service ManagerTomcat5ParametersJavaOptions</pre>

原值为

-Dcatalina.home="C:ApacheGroupTomcat 7.0"
-Djava.endorsed.dirs="C:ApacheGroupTomcat 7.0commonendorsed"
-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

写在最后

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

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

7c15ae753e2dd113c2d728b6dcda0980.png

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

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

相关文章

linux下的ssh端口号修改,如何在 Linux 中更改 SSH 端口

默认情况下&#xff0c; SSH 侦听端口 22 。 更改默认 SSH 端口可以降低被自动攻击的风险&#xff0c;从而为服务器增加额外的安全层。和更改默认端口相比&#xff0c;将防火墙配置为仅允许从特定主机访问端口 22 则更加简单和安全。本教程介绍如何更改 Linux 中的默认 SSH 端口…

【洛谷P1833】樱花

先说80分代码&#xff1a;最基本的混合背包&#xff0c;判断是完全&#xff0c;01&#xff0c;或是多重&#xff0c;再选择。 状态转移方程&#xff1a;f[j]max(f[j],f[j-co[i]]v[i]); 1 #include<bits/stdc.h>2 using namespace std;3 int a[10001],c[10001],t[10001],f…

TCC分布式事务

https://github.com/changmingxie/tcc-transaction转载于:https://www.cnblogs.com/520playboy/p/7235716.html

迭代器2

小结 凡是可作用于for循环的对象都是Iterable类型&#xff1b; 凡是可作用于next()函数的对象都是Iterator类型&#xff0c;它们表示一个惰性计算的序列&#xff1b; 集合数据类型如list、dict、str等是Iterable但不是Iterator&#xff0c;不过可以通过iter()函数获得一个Itera…

长尾关键词seo_为什么您不应该忘记长尾SEO

长尾关键词seoby Ben Rudolph通过本鲁道夫 为什么您不应该忘记长尾SEO (Why you shouldn’t forget about long tail SEO) A few months ago, I wrote about how I built ThingsOnReddit. It’s a site that finds the best Amazon products posted to Reddit and uses Amazon…

python调用hive与java调用区别_使用Pyhive调用

我正在使用pyhive与hive交互。在 使用下面的代码&#xff0c;SELECT语句运行良好。在# Import hive module and connect from pyhive import hive conn hive.Connection(host"HOST") cur conn.cursor() # Import pandas import pandas as pd # Store select query …

linux gnome启动命令,如何在Gnome Shell上自动启动程序

登录Gnome Shell时自动打开应用程序是提前设置工作区的好方法。在Gnome Shell上自动启动程序的最简单方法是使用Tweaks应用程序。在本指南中&#xff0c;我们将介绍如何安装Gnome Tweaks应用程序以轻松配置自动程序启动。让我们开始吧&#xff01;通过GUI自动启动程序默认情况下…

netstat查看linux运行的端口,查看哪些端口被打开 netstat -anp

一、查看哪些端口被打开 netstat -tnl二、关闭端口号:iptables -A OUTPUT -p tcp --dport 端口号-j DROP三、打开端口号&#xff1a;iptables -A INPUT -ptcp --dport 端口号-j ACCEPT四、保存设置service iptables save五、以下是linux打开端口命令的使用方法。nc -lp 23 &…

用户体验岗如何说服其他部门_为什么我们应该说服用户更新他们的浏览器-这是双赢的。...

用户体验岗如何说服其他部门by Alex Ewerlf由AlexEwerlf 为什么我们应该说服用户更新他们的浏览器-这是双赢的。 (Why we should convince our users to update their browsers — it’s a win-win.) Unless you’ve been living under a rock recently, you’re aware of Mel…

【JAVA并发编程实战】3、同步容器

同步容器包括Vector和Hashtable&#xff0c;还有一些由Collections.synchronizedXxx等工厂方法创建的 1、同步容器类的问题 同步容器类都是线程安全的&#xff0c;但是有些时候还是要客户端加锁来保护复合操作 就比如vector的操作&#xff0c;如果又两个方法一个获取vector集合…

php 动态加载html内容_ThinkPHP5.1+Swoole实现的开源内容管理框架

一款支持Swoole的开源内容管理框架&#xff0c;基于ThinkPHP5.1开发&#xff0c;同时支持PHP-FPM和Swoole双模式&#xff0c;让WEB开发更快!主要特性更改框架协议为MIT,让你更自由地飞基于ThinkPHP 5.1重构&#xff0c;但核心代码兼容5.0版本&#xff0c;保证老用户最小升级成本…

MarkDown语言

参考&#xff1a; 参考&#xff1a;https://typora.io/参考&#xff1a;https://caret.io/Markdown是一种轻量级标记语言&#xff0c;创始人为約翰格魯伯&#xff08;英语&#xff1a;John Gruber&#xff09;。 它允许人们“使用易读易写的纯文本格式编写文档&#xff0c;然后…

${fn:} 函数

调用这样一个头文件<% taglib prefix"fn" uri"http://java.sun.com/jsp/jstl/functions " %> 下面就可以直接调用以下的函数。 函数名 函数说明 使用举例 fn:contains 判断字符串是否包含另外一个字符串 <c:if test"${fn:contains(name, s…

linux7.2配置多路径软件,RHEL6使用系统自带多路径软件配置多路径,rhel6路径

RHEL6使用系统自带多路径软件配置多路径&#xff0c;rhel6路径1、多路径的主要功能多路径一般配合存储设备实现如下功能&#xff1a;故障的切换和恢复IO流量的负载均衡磁盘的虚拟化2、查看系统自带的多路径软件是否安装[rootcluster01 ~]# rpm -qa |grep device-mapperdevice-m…

小甲鱼python课后答案40讲_小甲鱼Python 第30讲课后习题看不懂

本帖最后由 keydnal_aaron 于 2018-1-18 14:17 编辑 这个测试的文本里面是英文字符串&#xff0c;如果环境不同&#xff0c;注意下文本内容的编码方式&#xff0c;我的编程环境是centos7python3.6.4 from os import walk,getcwd from os.path import join def search_file():查…

SM4密码算法(附源码)

SM4是我们自己国家的一个分组密码算法&#xff0c;是国家密码管理局于2012年发布的。网址戳→_→&#xff1a;http://www.cnnic.NET.cn/jscx/mixbz/sm4/具体的密码标准和算法官方有非常详尽的PDF文档以供查阅&#xff0c;戳→_→&#xff1a;http://218.241.108.63/wiki/images…

vim ctrlp_使用Ctrlp和Ctag使Vim更智能

vim ctrlpby _haochuan通过_haochuan 使用Ctrlp和Ctag使Vim更智能 (Make Your Vim Smarter Using Ctrlp and Ctags) I absolutely love Vim, and I use Vim for all my coding and writing from year to year. Although more are more people, especially for those are worki…

linux系统可以无显卡运行吗,Linux操作系统无显卡安装方式

显卡安装方法&#xff1a;操作步骤&#xff1a;1、SBC上装上显卡&#xff0c;并启动安装程序2、安装linux系统并选择相应的安装包(选择lilo启动加载程序)如果安装时以GRUB方式加载的&#xff0c;需要在Grub.conf中将有关图形的语句屏蔽掉。#splashimage(hd0,0)/grub/splash.xpm…

软件工程专业实习可以做什么_想要获得软件工程实习机会? 这里有一些想法可以帮助您...

软件工程专业实习可以做什么by Tatiana Doyle塔蒂亚娜道尔(Tatiana Doyle) 想要获得软件工程实习机会&#xff1f; 这里有一些想法可以帮助您。 (Looking to land a software engineering internship? Here are some thoughts to help you.) A note: this post is simply mea…

ubuntu 简单配置samba

关键字: ubuntu samba今天在家&#xff0c;闲着没事&#xff0c;就想学习一下samba 来实现windows xp 访问ubuntu 的文件夹&#xff08;家里有两台pc&#xff09;&#xff0c;google了很多文章&#xff0c;但是很多都没有用&#xff0c;不过鸟哥的文章有很清楚的介绍&#xff0…