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