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規範
》》》合理的從數據庫取得適量的數據(能從緩存拿就從緩存拿)
》》》好的代碼習慣
Java jvm內存調優(來自小強公開課)