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.pswp.cn/news/394838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394838.shtml
英文地址,請注明出處:http://en.pswp.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…