天天看點

Java jvm記憶體調優(來自小強公開課)

Java jvm記憶體調優

Jdk:java開發工具包

Jre:java運作環境,運作你編寫的java程式

Jvm:java虛拟機,.class檔案在虛拟機上運作

如何選擇合适的java虛拟機

》》》選擇穩定的jdk(慎用新出的,新特性的)

》》》根據平台和應用,選擇合适廠商的jdk。HP-UX隻能選擇HP JDK,AIX隻能選擇IBM JDK;windows 、linux可以選擇SUN JDK;solaris平台最好使用SUN JDK;開源JDK,目前生産環境中用的極少

》》》32bit or 64bit

》》》記憶體需求較小,CPU密集型應用選32bit

》》》大記憶體應用則選64bit(突破4G記憶體限制、吞吐量稍高)

Java記憶體

》》》Java記憶體 = 堆記憶體+非堆記憶體

》》》堆記憶體 = 年輕代+年老代 -Xms(最小)-Xmx(最大)

》》》非堆記憶體 = 永久代+其他 -XX:Pemsize -XX:MaxPermSise

》》》最新的java8中的jvm已經去掉了永久代,以Metaspace元空間代替

記憶體典型問題

》》》OOM VS ML

》》》OOM記憶體溢出,是程式在申請記憶體時,沒有足夠的記憶體供其使用

》》》ML記憶體洩露,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,導緻這塊記憶體一直占用

》》》最終表現基本是一樣的,通常記憶體洩露ML最終會導緻OOM錯誤。實際應用中不要太過糾結或劃清界限,每種現象都是關聯的。

記憶體問題常發生在什麼區域

》》》heap堆記憶體和pemanent區

》》》JVM程序記憶體和java使用的第三方本地代碼

比如:

》》》java堆記憶體不足,無法再配置設定新對象或記憶體塊

》》》java堆記憶體充足,但是S0,S1,eden,Old區配置設定不合理

如何預防記憶體方面的問題

系統方面:

》》》足夠的實體記憶體

》》》最佳的堆設定

》》》穩定的OS,jdk等

》》》适當的垃圾回收算法政策

代碼方面:

》》》不要放置大量對象到session中

》》》用完的資源一定要釋放,例如IO,file,jdbc

》》》不要違反j2ee規範

》》》合理的從資料庫取得适量的資料(能從緩存拿就從緩存拿)

》》》好的代碼習慣

本文轉自 32氪 51CTO部落格,原文連結:http://blog.51cto.com/10672221/2051997