Tomcat 内存与优化篇
Tomcat 內(nèi)存與優(yōu)化
一、Tomcat 運(yùn)行環(huán)境介紹
1.Tomcat 本身無(wú)法直接在計(jì)算機(jī)上運(yùn)行,需要依賴硬件基礎(chǔ)上的操作系統(tǒng)和Java虛擬機(jī);
2.Java 程序啟動(dòng)時(shí)JVM都會(huì)分配一個(gè)初始內(nèi)存和最大內(nèi)存給這個(gè)應(yīng)用;
3.當(dāng)應(yīng)用程序用到最大內(nèi)存的時(shí)刻,就會(huì)觸發(fā)JVM做垃圾回收(GC)動(dòng)作,釋放被占用的內(nèi)存;
4.因此想要調(diào)整Java程序啟動(dòng)時(shí)的初始內(nèi)存和最大內(nèi)存,需要向JVM申請(qǐng);
5.如果初始內(nèi)存大小設(shè)置過(guò)小,且此時(shí)初始化的應(yīng)用對(duì)象過(guò)多,虛擬機(jī)就必須重復(fù)的加載內(nèi)存來(lái)滿足使用;
6.基于以上原因,最好把初始內(nèi)存大小(Xms)和最大內(nèi)存(Xmx)設(shè)置成一樣;
7.JVM上所有的對(duì)象都在"""堆區(qū)(heap)"""上分配內(nèi)存(也有在"棧"上分配內(nèi)存的)
8.堆區(qū)的大小是可以動(dòng)態(tài)擴(kuò)展的,但"""堆"""的大小受限于系統(tǒng)使用的物理內(nèi)存,當(dāng)應(yīng)用程序需要的內(nèi)存超出"堆"的最大值時(shí),JVM虛擬機(jī)就會(huì)拋出內(nèi)存溢出異常,并且導(dǎo)致應(yīng)用程序奔潰;
9.基于以上原因,建議“堆”的大小設(shè)置成物理內(nèi)存的80%
二、Tomcat 內(nèi)存設(shè)置(for Linux)
1.<CATALINA_HOME>/bin/catalina.sh #路徑以及修改內(nèi)存的文件
2.JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m" #內(nèi)存參數(shù)以及值
3.-Xms:初始內(nèi)存大小
4.-Xmx:最大內(nèi)存
5.-Xss:每個(gè)線程所消耗的內(nèi)存大小(如-Xss15120是指每增加一個(gè)線程就會(huì)消耗15M內(nèi)存),最好設(shè)置成128K,默認(rèn)值為512K
6.-XX:PermSize:設(shè)定內(nèi)存的永久保存區(qū)初始大小,默認(rèn)為64M(永久是指方法區(qū)、永久代,還有年輕代、老年代)
7.-XX:MaxPermSize:設(shè)定內(nèi)存永久保存區(qū)最大大小,默認(rèn)為64M
8.其他參數(shù):
a) -XX:SurvivorRatio=2: #生還者池的大小,默認(rèn)是2,如果垃圾回收變成了瓶頸,可以嘗試定制生還者池設(shè)置
b) -XX:NewSize: #新生成的池的初始大小,默認(rèn)為2M
c) -XX:MaxNewSize: #新生成的池的最大大小,默認(rèn)為32M
d) +XX:AggressiveHeap #該參數(shù)會(huì)使得Xms沒(méi)有意義,這個(gè)參數(shù)讓參數(shù)JVM忽略Xmx參數(shù),瘋狂的吃掉一個(gè)G的物理內(nèi)存,再瘋狂的吃掉一個(gè)G的swap
e) -verbose:gc #實(shí)現(xiàn)垃圾收集信息
f) -Xloggc:gc.log #指定來(lái)及收集日志文件
g) -Xmn: #年輕代的堆區(qū)大小,一般設(shè)置成Xmx的3、4分之一
h) -XX:+UseParNewGC #縮短minor收集時(shí)間(minor GC是指在年輕代觸發(fā)的GC垃圾回收動(dòng)作)
I) -XX:+UseConcMarkSweepGC #縮短major收集的時(shí)間(major收集是指在年老代觸發(fā)Full GC垃圾回收動(dòng)作),此選項(xiàng)在heap size(堆區(qū)大小)比較大而且major收集時(shí)間較長(zhǎng)的情況下使用更合適
j) -XX:userParNewGC #可用來(lái)并行收集(多CPU)
k) -XX:ParallerGCThreads #可用來(lái)增加并行度(多CPU)
l) -XX:UseParallerGC #設(shè)置后可以使用并行清理收集器(多CPU)
m) 如果JVM的堆大小大于 1G,則應(yīng)該使用以下配置:
-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16
或者將堆的總大小的50%到60%分配給新生成的池,調(diào)大新對(duì)象區(qū),減少Full GC次數(shù)。
9.注意:
a) 虛擬機(jī)的"堆區(qū)大小"決定了虛擬機(jī)花費(fèi)在收集垃圾上的時(shí)間和頻率;
b) 如果"堆的大小"很大,那么執(zhí)行Full GC垃圾回收就會(huì)很慢,但是頻率降低了;
c) 如果把"堆的大小"調(diào)小,執(zhí)行Full GC垃圾收回就會(huì)很快,但是會(huì)更加頻繁;
d) 因此建議把"堆區(qū)大小"設(shè)置物理內(nèi)存的80%左右
e) 建議把內(nèi)存的最高值和最低值的差值縮小。不然會(huì)浪費(fèi)很多內(nèi)存;
f) 最低值加大,那么最高值可以隨便設(shè)置;
g) 但是要根據(jù)實(shí)際的物理內(nèi)存來(lái)設(shè)置,且大于物理內(nèi)存,tomcat就無(wú)法啟動(dòng),可能會(huì)導(dǎo)致內(nèi)存被系統(tǒng)收回,終止進(jìn)程
三、Tomcat 內(nèi)存溢出以及調(diào)整
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
a) 釋義:
1.JVM在啟動(dòng)的時(shí)刻會(huì)自動(dòng)設(shè)置JVM heap的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)不可能超過(guò)物理內(nèi)存;
2.可以利用JVM提供的 -Xmn -Xms -Xmx等選項(xiàng)進(jìn)行設(shè)置;
3.heap的大小是年輕代(Young Generation)和年老代(Tenured Generaion)之和;
4.在JVM中如果98%的時(shí)間用于GC,且可用的heap size不足2%的時(shí)刻將拋出此異常信息;
b) 解決:
1.手動(dòng)設(shè)置MaxPermSize的大小
2.JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
2. java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢出
a) 釋義:
1.PermGen Space全程是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域;
2.這里內(nèi)存溢出的原因是因?yàn)檫@塊內(nèi)存主要是被JVM存放class和meta信息的,class在被load的時(shí)刻被放入PermGen Space區(qū)域;
3.PermGen Space區(qū)域與存放instance的heap區(qū)域不同,GC不會(huì)在主程序運(yùn)行期間對(duì)PermGen Space進(jìn)行清理;
4.基于以上原因,如果你的APP會(huì)載入很多class的話,就很可能出現(xiàn)PermGen Space溢出;
b) 解決:
1.手動(dòng)設(shè)置MaxPermSize大小
3.java.lang.StackOverflowError ---- 棧溢出
a) 釋義:
1.JVM采用的是棧式虛擬機(jī),函數(shù)的調(diào)用過(guò)程都體現(xiàn)在堆棧和退棧上;
2.調(diào)用構(gòu)造函數(shù)的"層"太多了,以至于把棧區(qū)溢出了;
b) 解決:
1.修改程序
4.ava.lang.OutOfMemoryError: GC overhead limit exceeded?
a) 這里的意思是指JVM溢出
b) 增加參數(shù),-XX:-UseGCOverheadLimit,關(guān)閉這個(gè)特性,同時(shí)增加heap大小,-Xmx1024m
轉(zhuǎn)載于:https://www.cnblogs.com/wulaijun/p/5490699.html
總結(jié)
以上是生活随笔為你收集整理的Tomcat 内存与优化篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 转从内核文件系统看文件读写过程
- 下一篇: 关闭Eclipse的控制台console