|
jvm快照參數(shù)配置 使用的JVM參數(shù)的配置信息 1.堆快照:-XX: HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath=c:\m.hprof 2.錯(cuò)誤處理:-xx:OnOutOfMemoryError=c:\reset.bat 3. -Xloggc:${目錄}/managed1_gc.log -XX: HeapDumpOnOutOfMemoryError 3.怎樣解決內(nèi)存溢出問題首先通過看GC日志進(jìn)行排查,gc的頻率和次數(shù)。其次可以看dump堆的快照找到問題的所在,再結(jié)合一些工具,例如jprofiler來進(jìn)行內(nèi)存的跟蹤,隨時(shí)監(jiān)視垃圾回收,線程允許的狀況。 4.JVM調(diào)優(yōu)工具有哪些?Jconsole,jProfile,VisualVM。 堆信息查看,線程監(jiān)控,熱點(diǎn)分析。 (CPU熱點(diǎn):檢查系統(tǒng)哪些方法占用的大量CPU時(shí)間; 內(nèi)存熱點(diǎn):檢查哪些對(duì)象在系統(tǒng)中數(shù)量最大(一定時(shí)間內(nèi)存活對(duì)象和銷毀對(duì)象一起統(tǒng)計(jì)), 內(nèi)存泄露的檢查(內(nèi)存泄漏一般可以理解為系統(tǒng)資源(各方面的資源,堆、棧、線程等)在錯(cuò)誤使用的情況下, 導(dǎo)致使用完畢的資源無法回收(或沒有回收),從而導(dǎo)致新的資源分配請(qǐng)求無法完成,引起系統(tǒng)錯(cuò)誤。) 5.CPU使用率居高不下,腫么辦?把那幾個(gè)命令好好了解一下。調(diào)優(yōu)的命令,好好記一下 http://blog.csdn.net/jiangguilong2000/article/details/17971247 詳細(xì)的top命令請(qǐng)參考 http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html http://blog.csdn.net/feihong247/article/details/7874063 jstack:打印出給定的java進(jìn)程ID,分析dump文件 JPS:列出所有的jvm的實(shí)例 dsta 首先通過TOP命令找到,所有線程對(duì)CPU占用的情況。然后通過jstack來對(duì)具體的線程進(jìn)行具體的分析。 6.JVM性能調(diào)優(yōu)持久代用來防止類、類的一些常量操作 1.類和接口的全限定名 2、字段的名稱和描述符 3、方法和名稱和描述符 兩個(gè)原則 1.一個(gè)是將轉(zhuǎn)移到老年代的對(duì)象數(shù)量降到最少 因?yàn)槔夏甏臻g上的GC處理會(huì)花費(fèi)更多的時(shí)間,減少被轉(zhuǎn)移到老年代對(duì)象的數(shù)據(jù)可以顯著地減少Full GC的頻率??梢酝ㄟ^調(diào)整新生代空間的大小。 2、另一個(gè)是減少full GC的執(zhí)行時(shí)間 FULL GC的執(zhí)行時(shí)間要比Minor GC要長(zhǎng)的多,因此如果full gc花費(fèi)了太多的時(shí)間的話,一些連接可能會(huì)發(fā)生超時(shí)的錯(cuò)誤。如果視圖通過減少老年代空間來減少full GC執(zhí)行的時(shí)間,可能會(huì)導(dǎo)致OutofMemoryError或者full gc執(zhí)行的次數(shù)會(huì)增加。 是否需要進(jìn)行g(shù)c優(yōu)化 一般情況下,如果GC執(zhí)行的時(shí)間只有0.1--0.3秒的話,就沒必要浪費(fèi)時(shí)間去進(jìn)行GC優(yōu)化,但是如果GC執(zhí)行的時(shí)間在1秒或者2秒以上的話,GC將勢(shì)在必行。 一般下面情況下就不需要進(jìn)行GC優(yōu)化了 1.Minor GC執(zhí)行的很快(小于50ms) 2.Minor GC執(zhí)行的并不頻繁(大概10秒一次吧) 3.Full GC執(zhí)行的很快(小于1秒) 4.FULL GC執(zhí)行的并不頻繁(10分鐘一次) 3.調(diào)整GC類型/內(nèi)存空間 選擇調(diào)整合適的GC類型和設(shè)定內(nèi)存空間,針對(duì)性的優(yōu)化 4.分析結(jié)果 調(diào)整了GC參數(shù)后,持續(xù)收集24小時(shí)日志,進(jìn)行結(jié)果分析。如果幸運(yùn)的話,就找到最適合系統(tǒng)的GC參數(shù),反之就需要分析日志來檢查內(nèi)存是如何來分配的。然后需要不斷的調(diào)整GC類型和內(nèi)存空間大小找到最佳的參數(shù) 5.如何設(shè)定空間大小 一般老年代我建議設(shè)置為500M,也就是一次fullgc后,如果老年代剩余300M的話,這就是300M(程序占用) 500(老年代最小空間) 200M(空閑內(nèi)存) 至于新生代和老年代之間的比例呢一般設(shè)置為1比1 代碼優(yōu)化 1、盡量在合適的地方使用單例 2、盡量避免隨意使用靜態(tài)變量 例如 A類里面有一個(gè)靜態(tài)變量B,此時(shí)靜態(tài)變量B的聲明周期與類A同步,如果A不卸載的話,對(duì)象會(huì)常駐在內(nèi)存,直到程序終止 3、盡力避免過多的創(chuàng)建java對(duì)象 例如在循環(huán)中new 對(duì)象,因?yàn)橄到y(tǒng)不僅需要花費(fèi)時(shí)間來創(chuàng)建對(duì)象,而且還需要花費(fèi)時(shí)間來進(jìn)行垃圾回收 4、盡量使用final修飾符 首先final修飾符的類是不可派生的,并且java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)所有的final方法,能夠提高性能一半 5、盡量使用局部變量 調(diào)用方法時(shí),參數(shù)傳遞的都是臨時(shí)變量,保存在棧中,其他變量入靜態(tài)變量 實(shí)例變量都在Heap中創(chuàng)建。速度較慢 6、慎用synchronized方法 7、盡量使用stringbuilder和stringbuffer 8、盡量不要使用finalize方法 9、盡量使用基本類型代替對(duì)象 10、單線程盡量使用hashmap、arraylist 11、盡量合理的創(chuàng)建hashmap,避免進(jìn)行hash重構(gòu) 12、盡量使用位移來代替A/B的操作。 |
|
|