Tomcat本身不能直接在計(jì)算機(jī)上運(yùn)行,需要依賴于操作系統(tǒng)和一個(gè)JAVA虛擬機(jī)。JAVA程序啟動(dòng)時(shí)JVM會(huì)分配一個(gè)初始內(nèi)存和最大內(nèi)存給程序。當(dāng)程序需要的內(nèi)存超出內(nèi)存的最大值時(shí)虛擬機(jī)就會(huì)提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。一、常見的Java內(nèi)存溢出有以下三種:1. Java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出
解釋說(shuō)明:JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置JVM Heap的值,JVM堆的設(shè)置是指java程序運(yùn)行過(guò)程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置。其初始空間默認(rèn)是物理內(nèi)存的1/64,最大空間不可超過(guò)物理內(nèi)存。JVM提供-Xmn -Xms -Xmx等選項(xiàng)來(lái)進(jìn)行設(shè)置。出錯(cuò)場(chǎng)景:在JVM中,如果98%的時(shí)間是用于GC,且可用的Heap size不足2%時(shí),將會(huì)出現(xiàn)JVM Heap溢出解決方法:修改JVM Heap的大小。2. java.lang.OutOfMemoryError: PermGen space 即PermGen space溢出解釋說(shuō)明:PermGen space是指內(nèi)存的永久保存區(qū)域。這個(gè)區(qū)域主要存放Class和Meta信息,Class在被Load時(shí)就會(huì)被放入PermGen space。
出錯(cuò)場(chǎng)景:如果APP載入很多CLASS,就可能會(huì)出現(xiàn)PermGen space溢出。(因?yàn)閟un的GC不會(huì)在程序運(yùn)行時(shí)對(duì)PermGen space進(jìn)行清理)常見于web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候解決方法:修改MaxPermSize大小3. java.lang.StackOverflowError 即棧溢出
解釋說(shuō)明:JVM采用的是棧式的虛擬機(jī),函數(shù)的調(diào)用過(guò)程都體現(xiàn)在堆棧和退棧上。出錯(cuò)場(chǎng)景:通常棧的大小是1-2MB的,如果調(diào)用構(gòu)造函數(shù)的 “層”太多,則會(huì)出現(xiàn)棧溢出解決方法:修改程序二、Tomcat的JVM內(nèi)存溢出解決方法在生產(chǎn)環(huán)境中,tomcat內(nèi)存設(shè)置不好很容易出現(xiàn)JVM內(nèi)存溢,解決方法就是修改Tomcat中的catalina.sh文件。在catalina.sh文件中,找到cygwin=false,在這一行的前面加入?yún)?shù),具體如下
# vi TOMCAT_HOME/bin/catalina.shJAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"其他說(shuō)明:1.“m”說(shuō)明單位是MB,否則默認(rèn)是KB2.一般使用物理內(nèi)存的80%作為堆大小3.一般把-Xms和-Xmx設(shè)為一樣大4.一般把-Xmn設(shè)置為-Xmx值的1/45.一般將堆的總大小的50%到60%分配給新生成的池三、jvm參數(shù)說(shuō)明:-server 一定要作為第一個(gè)參數(shù),啟用JDK的server版本,在多個(gè)CPU時(shí)性能佳-Xms java Heap初始大小。 默認(rèn)是物理內(nèi)存的1/64。-Xmx java heap最大值。建議均設(shè)為物理內(nèi)存的80%。不可超過(guò)物理內(nèi)存。-Xmn java heap最小值,一般設(shè)置為Xmx的3、4分之一。-XX:PermSize 設(shè)定內(nèi)存的永久保存區(qū)初始大小,缺省值為64M。-XX:MaxPermSize 設(shè)定內(nèi)存的永久保存區(qū)最大大小,缺省值為64M。-XX:SurvivorRatio=2 生還者池的大小,默認(rèn)是2。如-XX:NewSize 新生成的池的初始大小。 缺省值為2M。-XX:MaxNewSize 新生成的池的最大大小。 缺省值為32M。+XX:AggressiveHeap 讓jvm忽略Xmx參數(shù),瘋狂地吃完一個(gè)G物理內(nèi)存,再吃盡一個(gè)G的swap。-Xss 每個(gè)線程的Stack大小-verbose:gc 現(xiàn)實(shí)垃圾收集信息-Xloggc:gc.log 指定垃圾收集日志文件-XX:+UseParNewGC 縮短minor收集的時(shí)間-XX:+UseConcMarkSweepGC 縮短major收集的時(shí)間-XX:userParNewGC 可用來(lái)設(shè)置并行收集(多CPU)-XX:ParallelGCThreads 可用來(lái)增加并行度(多CPU)-XX:UseParallelGC 設(shè)置后可以使用并行清除收集器(多CPU)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。