首先先說一下JVM內(nèi)存結(jié)構(gòu)問題,JVM為兩塊:PermanentSapce和HeapSpace,其中

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