首先先說一下JVM內(nèi)存結(jié)構問題,JVM為兩塊:PermanentSapce和HeapSpace,其中
站在用戶的角度思考問題,與客戶深入溝通,找到西陵網(wǎng)站設計與西陵網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)絡空間、企業(yè)郵箱。業(yè)務覆蓋西陵地區(qū)。
Heap = }。PermantSpace負責保存反射對象,一般不用配置。JVM的Heap區(qū)可以通過-X參數(shù)來設定。
當一個URL被訪問時,內(nèi)存申請過程如下:
A. JVM會試圖為相關Java對象在Eden中初始化一塊內(nèi)存區(qū)域
B. 當Eden空間足夠時,內(nèi)存申請結(jié)束。否則到下一步
C. JVM試圖釋放在Eden中所有不活躍的對象(這屬于1或更高級的垃圾回收), 釋放后若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區(qū)
D. Survivor區(qū)被用來作為Eden及OLD的中間交換區(qū)域,當OLD區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū),否則會被保留在Survivor區(qū)
E. 當OLD區(qū)空間不夠時,JVM會在OLD區(qū)進行完全的垃圾收集(0級)
F. 完全垃圾收集后,若Survivor及OLD區(qū)仍然無法存放從Eden復制過來的部分對象,導致JVM無法在Eden區(qū)為新對象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)”out of memory錯誤”
JVM調(diào)優(yōu)建議:
ms/mx:定義YOUNG+OLD段的總尺寸,ms為JVM啟動時YOUNG+OLD的內(nèi)存大小;mx為最大可占用的YOUNG+OLD內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個值設為相同,以減少運行期間系統(tǒng)在內(nèi)存申請上所花的開銷。
NewSize/MaxNewSize:定義YOUNG段的尺寸,NewSize為JVM啟動時YOUNG的內(nèi)存大小;MaxNewSize為最大可占用的YOUNG內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個值設為相同,以減少運行期間系統(tǒng)在內(nèi)存申請上所花的開銷。
PermSize/MaxPermSize:定義Perm段的尺寸,PermSize為JVM啟動時Perm的內(nèi)存大小;MaxPermSize為最大可占用的Perm內(nèi)存大小。在用戶生產(chǎn)環(huán)境上一般將這兩個值設為相同,以減少運行期間系統(tǒng)在內(nèi)存申請上所花的開銷。
SurvivorRatio:設置Survivor空間和Eden空間的比例
內(nèi)存溢出的可能性
1. OLD段溢出
這種內(nèi)存溢出是最常見的情況之一,產(chǎn)生的原因可能是:
1) 設置的內(nèi)存參數(shù)過小(ms/mx, NewSize/MaxNewSize)
2) 程序問題
單個程序持續(xù)進行消耗內(nèi)存的處理,如循環(huán)幾千次的字符串處理,對字符串處理應建議使用StringBuffer。此時不會報內(nèi)存溢出錯,卻會使系統(tǒng)持續(xù)垃圾收集,無法處理其它請求,相關問題程序可通過Thread Dump獲取(見系統(tǒng)問題診斷一章)單個程序所申請內(nèi)存過大,有的程序會申請幾十乃至幾百兆內(nèi)存,此時JVM也會因無法申請到資源而出現(xiàn)內(nèi)存溢出,對此首先要找到相關功能,然后交予程序員修改,要找到相關程序,必須在Apache日志中尋找。
當Java對象使用完畢后,其所引用的對象卻沒有銷毀,使得JVM認為他還是活躍的對象而不進行回收,這樣累計占用了大量內(nèi)存而無法釋放。由于目前市面上還沒有對系統(tǒng)影響小的內(nèi)存分析工具,故此時只能和程序員一起定位。
2. Perm段溢出
通常由于Perm段裝載了大量的Servlet類而導致溢出,目前的解決辦法:
1) 將PermSize擴大,一般256M能夠滿足要求
2) 若別無選擇,則只能將servlet的路徑加到CLASSPATH中,但一般不建議這么處理
3. C Heap溢出
系統(tǒng)對C Heap沒有限制,故C Heap發(fā)生問題時,Java進程所占內(nèi)存會持續(xù)增長,直到占用所有可用系統(tǒng)內(nèi)存
參數(shù)說明:
JVM 堆內(nèi)存(heap)設置選項
參數(shù)格式
說 明
設置新對象生產(chǎn)堆內(nèi)存(Setting the Newgeneration heap size)
-XX:NewSize
通過這個選項可以設置Java新對象生產(chǎn)堆內(nèi)存。在通常情況下這個選項的數(shù)值為1 024的整數(shù)倍并且大于1MB。這個值的取值規(guī)則為,一般情況下這個值-XX:NewSize是最大堆內(nèi)存(maximum heap size)的四分之一。增加這個選項值的大小是為了增大較大數(shù)量的短生命周期對象
增加Java新對象生產(chǎn)堆內(nèi)存相當于增加了處理器的數(shù)目。并且可以并行地分配內(nèi)存,但是請注意內(nèi)存的垃圾回收卻是不可以并行處理的
設置最大新對象生產(chǎn)堆內(nèi)存(Setting the maximum New generation heap size)
-XX:MaxNewSize
通過這個選項可以設置最大Java新對象生產(chǎn)堆內(nèi)存。通常情況下這個選項的數(shù)值為1 024的整數(shù)倍并且大于1MB
其功用與上面的設置新對象生產(chǎn)堆內(nèi)存-XX:NewSize相同
設置新對象生產(chǎn)堆內(nèi)存的比例(Setting New heap size ratios)
-XX:SurvivorRatio
新對象生產(chǎn)區(qū)域通常情況下被分為3個子區(qū)域:伊甸園,與兩個殘存對象空間,這兩個空間的大小是相同的。通過用-XX:SurvivorRatio=X選項配置伊甸園與殘存對象空間(Eden/survivor)的大小的比例。你可以試著將這個值設置為8,然后監(jiān)控、觀察垃圾回收的工作情況
設置堆內(nèi)存池的最大值(Setting maximum heap size)
-Xmx
通過這個選項可以要求系統(tǒng)為堆內(nèi)存池分配內(nèi)存空間的最大值。通常情況下這個選項的數(shù)值為1 024的整數(shù)倍并且大于1 MB
一般情況下這個值(-Xmx)與最小堆內(nèi)存(minimum heap size –Xms)相同,以降低垃圾回收的頻度
取消垃圾回收
-Xnoclassgc
這個選項用來取消系統(tǒng)對特定類的垃圾回收。它可以防止當這個類的所有引用丟失之后,這個類仍被引用時不會再一次被重新裝載,因此這個選項將增大系統(tǒng)堆內(nèi)存的空間
設置棧內(nèi)存的大小
-Xss
這個選項用來控制本地線程棧的大小,當這個選項被設置的較大(2MB)時將會在很大程度上降低系統(tǒng)的性能。因此在設置這個值時應該格外小心,調(diào)整后要注意觀察系統(tǒng)的性能,不斷調(diào)整以期達到最優(yōu)
最后說一句,你的機器的連接數(shù)設置也至關重要,連接的關閉最好把時間設置的少些,那些連接非常耗費資源。也是引起內(nèi)存泄露的主要原因。
內(nèi)存溢出可能是以下原因:
內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);
調(diào)用接口超時且超時等待時間設置過長;
集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;
代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復的對象實體;
啟動參數(shù)內(nèi)存值設定的過小;
那么針對的結(jié)局方案:
優(yōu)化數(shù)據(jù)庫查詢語句,如改成分頁查詢;
調(diào)用接口超時時間設置短一些,打印錯誤日志,修正超時的接口;
集合類使用完后設置成null,例:在執(zhí)行完list之后寫上list=null;
使用debug逐步查找死循環(huán)的代碼
將jvm內(nèi)存的值增大:-Xms1024m -Xmx1024m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m (設置的值依據(jù)服務器內(nèi)存的大小來設定)
純手打,望采納。
for循環(huán)里面寫:{
addBatch (你的insert語句 )
這里可以控制1萬條做一次提交
if(i%10000==0) ps.executeBatch();
//清空batch
ps.clearBatch ()
}
這樣就不會頻繁調(diào)用insert操作數(shù)據(jù)庫,100萬也就操作100次提交