1)多數(shù)的Java應用不需要在服務器上進行GC優(yōu)化;
2)多數(shù)導致GC問題的Java應用,都不是因為我們參數(shù)設置錯誤,而是代碼問題;
3)在應用上線前,先考慮將JVM參數(shù)設置到最優(yōu);
4)減少對象創(chuàng)建的數(shù)量;
5)減少全局變量和大對象;
6)GC優(yōu)化是最后不得已才使用的手段,在實際應用中,分析GC情況優(yōu)化代碼比優(yōu)化GC參數(shù)要多得多;
通過看監(jiān)控中的jvm是否有fgc,頻繁fgc才需要優(yōu)化(頻繁fgc需要抓緊改配置)
1)JDK的命令行工具
Sun JDK監(jiān)控和故障處理命令有jps、jstat、jmap、jhat、jstack、jinfo
jps(虛擬機進程狀況工具):顯示指定系統(tǒng)內所有的HotSpot虛擬機進程。 jstat(虛擬機統(tǒng)計信息監(jiān)視工具):用于監(jiān)視虛擬機運行時狀態(tài)信息的命令,它可以顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數(shù)據(jù)。 jinfo(Java配置信息工具):jinfo的作用是實時地查看和調整虛擬機各項參數(shù)。
jmap(Java內存映像工具):dump堆到文件,可用于對文件的分析。
jhat(虛擬機堆轉儲快照分析工具):jhat命令與jmap搭配使用,來分析jmap生成的堆 轉儲快照。jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果后,可以在瀏覽器中查看。
jstack(Java堆棧跟蹤工具):jstack命令用于生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執(zhí)行的方法堆棧 的集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖、死循 環(huán)、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。線程出現(xiàn)停頓 的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做些 什么事情,或者等待著什么資源。
2)JConsole
Jconsole(Java Monitoring and Management Console)是從java5開始,在JDK中自帶的java監(jiān)控和管理控制臺,用于對JVM中內存,線程和類等的監(jiān)控,是一個基于JMX(java management extensions)的GUI性能監(jiān)測工具。jconsole使用jvm的擴展機制獲取并展示虛擬機中運行的應用程序的性能和資源消耗等信息。
概覽:包括堆內存使用情況、線程、類、CPU使用情況四項信息的曲線圖。
3)VisualVM
VisualVM(All-in-One Java Troubleshooting Tool)是功能最強大的運行監(jiān)視和故障處理程序之一,曾經(jīng)在很長一段時間內是Oracle官方主力發(fā)展的虛擬機故障處理工具。
相比一些第三方工具,VisualVM有一個很大的優(yōu)點:不需要被監(jiān)視的程序基于特殊Agent去運行,因此它的通用性很強,對應用程序實際性能的影響也較小,使得它可以直接應用在生產環(huán)境中。
Visual GC 是常常使用的一個功能,需要通過插件按照,可以明顯的看到年輕代、老年代的內存變化,以及gc頻率、gc的時間等!
觸發(fā) java.lang.OutOfMemoryError:最常見的原因就是應用程序需要的堆空間需要的是大的,但是 JVM 提供的卻是小的,從而導致內存溢出。這個解決方法就是提供大的堆空間即可。
除此之外還有復雜的原因:內存泄露。特定的編程錯誤會導致你的應用程序不停的消耗更多的內存,每次使用有內存泄漏風險的功能就會留下一些不能被回收的對象到堆空間中,隨著時間的推移,泄漏的對象會消耗所有的堆空間,最終觸發(fā)java.lang.OutOfMemoryError: Java heap space 錯誤。
1.確保有足夠的堆空間來正常運行你的應用程序,在 JVM 的啟動配置中增加如下配置:-Xmx1024m。
2.流量/數(shù)據(jù)量峰值:應用程序在設計之初均有用戶量和數(shù)據(jù)量的限制,某一時刻,當用戶數(shù)量或數(shù)據(jù)量突然達到一個 峰 值 , 并 且 這 個 峰 值 已 經(jīng) 超 過 了 設 計 之 初 預 期 的 閾 值 , 那 么 以 前 正 常 的 功 能 將 會 停 止 , 并 觸 發(fā)java.lang.OutOfMemoryError
3.Java heap space 異常解決方案,如果你的應用程序確實內存不足,增加堆內存會解決 GC overhead limit 問題,就如下面這樣,給你的應用程序 1G 的堆內存:java -Xmx1024m com.yourcompany.YourClass。