JAVA內(nèi)存溢出詳解_第1頁(yè)
JAVA內(nèi)存溢出詳解_第2頁(yè)
JAVA內(nèi)存溢出詳解_第3頁(yè)
JAVA內(nèi)存溢出詳解_第4頁(yè)
JAVA內(nèi)存溢出詳解_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、調(diào)整 虛擬機(jī)參數(shù)二 立即 釋放無(wú)用的對(duì)象三 利用序列化和反序列化技術(shù) 下面是具體的代碼實(shí)現(xiàn) package com.free;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.math.BigInt

2、eger;import java.util.ArrayList;import java.util.List;* author free* springcomingagain*/public class OutMemorySolution /* Change JVM Arguments* 調(diào)整 虛擬機(jī)參數(shù)* First Try* -Xloggc:gc.log* -Xms256M* -Xmx256M* throw java.lang.OutOfMemoryError: Java heap space* Second Try* -Xloggc:gc.log* -Xms512M* -Xmx512M*/

3、 public static void changeJVMArguments() long startTime = System.currentTimeMillis();System.out.println("Start : " + startTime);List list = new ArrayList(0);for (int i = 0; i < 5000000; i+) list.add(new BigInteger("1000000");long endTime = System.currentTimeMillis();System.out

4、.println("End. : " + endTime + " Cost : " + (endTime - startTime);/* Release Object Immediate* 立即 釋放無(wú)用的對(duì)象* Release Object* /First Release Object* BigInteger temp1 = null;* for (int i = 0; i < 1200000; i+) * temp1 = array1i;* temp1 = null;* array1i = null;* * array1 = null;* /S

5、econd Release Object* temp1 = null;* for (int i = 0; i < 1200000; i+) * temp1 = array2i;* temp1 = null;* array2i = null;* * array2 = null;*/ public static void releaseObjectImmediate() long startTime = System.currentTimeMillis(); System.out.println("First Start : " + startTime); BigInte

6、ger array1 = new BigInteger1200000;for (int i = 0; i < 1200000; i+) array1i = new BigInteger("10000000");/ First Release ObjectBigInteger temp1 = null;for (int i = 0; i < 1200000; i+) temp1 = array1i;temp1 = null;array1i = null;array1 = null;long endTime = System.currentTimeMillis();

7、System.out.println("First End. : " + endTime + " Cost : "+ (endTime - startTime);/ do something start/ do something end.startTime = System.currentTimeMillis();System.out.println("Second Start : " + startTime);BigInteger array2 = new BigInteger1200000;for (int i = 0; i &

8、lt; 1200000; i+) array2i = new BigInteger("10000000");/ Second Release Objecttemp1 = null;for (int i = 0; i < 1200000; i+) temp1 = array2i;temp1 = null;array2i = null;array2 = null;endTime = System.currentTimeMillis();System.out.println("Second End. : " + endTime + " Cost

9、 : " + (endTime - startTime); /* delaySave* 利用序列化和反序列化技術(shù)*Store Object*read Object*do something*/SuppressWarnings("unchecked")public static void delaySave() final String objectStoreFolder ="D:obj"System.out.println("Store Object Start.");/ Store Object 序列化對(duì)象ObjectOu

10、tputStream out = null; try out = new ObjectOutputStream(new FileOutputStream( objectStoreFolder+ "objectFile.obj" + 0);List list = new ArrayList(0);for (int i = 0; i < 5000000; i+) if (i+1) % 100000) = 0) out.writeObject(list); out.close(); out = null; list = null;list = new ArrayList(0

11、);out = new ObjectOutputStream(new FileOutputStream( objectStoreFolder+ "objectFile.obj" + (i % 1000000) + 1); System.out.println(i); list.add(new BigInteger("1000000"); catch (FileNotFoundException e) System.err.println(e.getMessage(); catch (IOException e) System.err.println(e.

12、getMessage(); finally if(null != out ) try out.close(); out = null; catch (IOException e) / ignoreSystem.out.println("Store Object End."); System.out.println("Read Object Start.");/ read Object 反序列化對(duì)象File fileList = new File(objectStoreFolder).listFiles(); int fileSize = fileList

13、.length;ObjectInputStream in = null;try for (int i = 0; i < fileSize; i+) in = new ObjectInputStream( new FileInputStream(fileListi); List list = (List) in.readObject();/ do something startSystem.out.println(list.size();/ do something end. catch (FileNotFoundException e) System.err.println(e.getM

14、essage(); catch (IOException e) System.err.println(e.getMessage(); catch (ClassNotFoundException e) System.err.println(e.getMessage(); finally if(null != in ) try in.close(); in = null; catch (IOException e) / ignore System.out.println("Read Object End."); /* Test code* param args*/public

15、static void main(String args) changeJVMArguments();releaseObjectImmediate(); delaySave();提示:這段代碼用的是 JDK6.0 ,發(fā)現(xiàn)立即釋放無(wú)用的對(duì)象,這個(gè)方法來(lái)解決內(nèi)存溢出 不是很理想。、 java.lang.OutOfMemoryError: PermGen spacePermGen space的全稱(chēng)是 Permanent Generation space, 是指內(nèi)存的永久保存區(qū) 域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時(shí)就會(huì)被 放至U PermGen spa

16、ce 中,它和存放類(lèi)實(shí)例(Instanee)的Heap區(qū)域不同,GC(Garbage Collection) 不會(huì)在主 程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS勺話,就很可能出現(xiàn) PermGen space錯(cuò)誤,這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。如果你的WEB APP 下都用了大量的第三方 jar, 其大小超過(guò)了 jvm默認(rèn)的大小(4M)那么就會(huì)產(chǎn)生此錯(cuò)誤信息了。解決方法:手動(dòng)設(shè)置MaxPermSize大小修改 TOMCAT_HOME/bin/catalina.sh在“ echo "Usi ng CATALI

17、NA_BASE: $CATALINA_BAS” 上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M" 建議:將相同的第三方 jar 文件移置到 tomcat/shared/lib 目錄下, 這樣可以達(dá) 到減少 jar 文檔重復(fù)占用內(nèi)存的目的。二、 java.lang.OutOfMemoryError: Java heap spaceHeap size 設(shè)置JVM堆的設(shè)置是指java程序運(yùn)行過(guò)程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置 Heap size的值,其初始空間(即

18、-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4???以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置。 Heapsize 的大小是 YoungGeneration 和 Tenured Generaion 之和。 提示:在JVM中如果98%的時(shí)間是用于GC且可用的Heap size不足2%的時(shí)候 將拋出此異常信息。提示:Heap Size最大不要超過(guò)可用物理內(nèi)存的 80%, 一般的要將-Xms和-Xmx 選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。解決方法:手動(dòng)設(shè)置 Heap size修改 TOMCAT_HOME/bin/catalina.sh 在“ e

19、cho "Usi ng CATALINA_BASE: $CATALINA_BASE"上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"、實(shí)例,以下給出1G內(nèi)存環(huán)境下java jvm 的參數(shù)設(shè)置參考:JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "一、 java.l

20、ang.OutOfMemoryError: PermGen spacePermGen space的全稱(chēng)是 Permanent Generation space, 是指內(nèi)存的永久保存區(qū) 域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時(shí)就會(huì)被 放至U PermGen space 中,它和存放類(lèi)實(shí)例(Instanee)的Heap區(qū)域不同,GC(Garbage Collection) 不會(huì)在主 程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS勺話,就很可能出現(xiàn) PermGen space錯(cuò)誤,這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行

21、pre compile的時(shí)候。如果你的WEB APP 下都用了大量的第三方 jar, 其大小超過(guò)了 jvm默認(rèn)的大?。?M)那么就會(huì)產(chǎn)生此錯(cuò)誤信息了。解決方法:手動(dòng)設(shè)置MaxPermSize大小修改 TOMCAT_HOME/bin/catalina.sh在“ echo "Us ing CATALINA _BASE: $CATALINA_BAS” 上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M" 建議:將相同的第三方 jar 文件移置到 tomcat/shared/lib 目錄下,這

22、樣可以達(dá) 到減少 jar 文檔重復(fù)占用內(nèi)存的目的。二、 java.lang.OutOfMemoryError: Java heap spaceHeap size 設(shè)置JVM堆的設(shè)置是指java程序運(yùn)行過(guò)程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè) 置JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置 Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。可 以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置。 Heapsize 的大小是 YoungGeneration 和 Tenured Generaion 之和。 提示:在JVM中如果98%的時(shí)間是用于G

23、C且可用的Heap size不足2%的時(shí)候 將拋出此異常信息。提示:Heap Size最大不要超過(guò)可用物理內(nèi)存的 80%, 一般的要將-Xms和-Xmx 選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。解決方法:手動(dòng)設(shè)置 Heap size修改 TOMCAT_HOME/bin/catalina.sh 在“ echo "Usi ng CATALINA_BASE: $CATALINA_BASE"上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"、實(shí)例,以下給出1G內(nèi)存環(huán)境下ja

24、va jvm 的參數(shù)設(shè)置參考:JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M-XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "關(guān)于 Java 內(nèi)存溢出的解決辦法你好,前幾天我上msn時(shí)候看到你在 msn的簽名是JDK解決內(nèi)存溢出,突然想給你提點(diǎn)這方 面的建議。1. 內(nèi)存容易溢出可以說(shuō)是因?yàn)樵诔绦蛑杏袃?nèi)存泄漏 (memory leak) 的問(wèn)題 , 容易引起內(nèi)存溢 出的直接原因可以歸結(jié)為代碼質(zhì)量問(wèn)題,在內(nèi)存中存在大量的對(duì)象,垃圾回收器

25、不能回收, 隨著程序的不斷運(yùn)行, 程序會(huì)創(chuàng)造更多的對(duì)象, 這些對(duì)象之間存在一定的內(nèi)聯(lián)關(guān)系, 所以不 容易造成被 java 垃圾回收器回收。解決的辦法就是,對(duì)所有的代碼包括頁(yè)面中的 java 代碼都進(jìn)行一遍徹底的 review ,對(duì)那些 靜態(tài) (static) 的對(duì)象要特別留神,特別是類(lèi)型為 Map,List,Set 的,靜態(tài)的變量會(huì)一直駐存 在內(nèi)存中,生命周期比較長(zhǎng),不會(huì)被垃圾器回收。對(duì)于代碼, 要審查是否生成了大量的冗余的對(duì)象, 還有一些邏輯業(yè)務(wù)處理的類(lèi), 算法是否過(guò) 于復(fù)雜,調(diào)整算法。對(duì)于代碼認(rèn)真審查,再仔細(xì)重構(gòu)一遍代碼,能提高代碼質(zhì)量,提高程序運(yùn)行穩(wěn)定性。在人工審查前,可以先由工具審查一遍,幾個(gè)開(kāi)源的工具如下:1. Findbugs, 2. Checkstyle, 3. PMD,人工和工具相互結(jié)合,效果更好一些。2. 程序運(yùn)行的時(shí)間過(guò)長(zhǎng)了后, 還是容易在內(nèi)存中生成過(guò)多的對(duì)象, 造成一些問(wèn)題, 所以可以 編寫(xiě)一個(gè)腳本( lin

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論