日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 强制gc_java应用性能调优之详解System的gc垃圾回收方法

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 强制gc_java应用性能调优之详解System的gc垃圾回收方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是System.gc()?

System.gc()是用Java,C#和許多其他流行的高級編程語言提供的API。當它被調用時,它將盡最大努力從內存中清除垃圾(即未被引用的對象)。名詞解釋:GC,Garbage Collection,垃圾回收,下文會經常使用。

二、誰可以調用System.gc()?

System.gc()?可以從應用程序堆棧的各個部分調用:

您自己開發的應用程序可以顯式的調用?System.gc()?方法。

System.gc()?也可以由您的第三方庫,框架觸發。

可以由外部工具(如VisualVM)通過使用JMX觸發

如果您的應用程序使用了RMI,RMI會定期調用?System.gc()?。

三、調用System.gc()有什么弊端?

當?System.gc()?或?Runtime.getRuntime().gc()API被調用時,將觸發完整的GC事件。在GC完成之前,整個JVM將凍結(即正在運行的所有服務將被暫停),通常完整的GC需要很長時間才能完成。因此在不合適的時間運行GC,將導致不良的用戶體驗,甚至是崩潰。

JVM具有復雜的算法,該算法始終在后臺運行,進行所有計算以及有關何時觸發GC的計算。當您顯式調用System.gc()調用時,所有這些計算都將被拋掉。

四、哪些場景適合顯式調用System.gc()?

GC操作應該由JVM自行控制,在絕大部分的場景都不建議程序員手動寫代碼顯式進行System.gc()操作,但是也不排除其中個別例外:在我們開發多個微服務時,每個服務都有多個備份節點。在非業務高峰時段,我們可以從微服務-負載均衡的節點池中取出其中一個JVM實例。然后通過該JVM上的JMX顯式觸發System.gc()調用,一旦GC事件完成并且從內存中清除了垃圾,將該JVM放回到微服務-負載均衡的節點池中。

當然這個過程需要很好的微服務管理及服務發布機制配合,這樣既能保證JVM垃圾內存的有效清理,又不影響業務的正常運行。

五、如何檢測您的應用程序正在進行System.gc()?

如第二小節所講:?System.gc()?可以從多個渠道進行的調用,而不僅僅是從您的應用程序源代碼進行的調用。因此,搜索您的應用程序代碼System.gc()?字符串,不足以知道?GC是否正在被調用。這就構成了一個挑戰:如何檢測應用程序是否正在進行垃圾回收?這就是GC日志派上用場的地方。

// java 8 啟用GC日志:

// -XX:+PrintGCDetails -Xloggc: ,例如下面這行代碼

-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log

// java 9 啟用GC日志:-Xlog:gc*:file= ,例如下面這行代碼

-Xlog:gc*:file=/opt/tmp/myapp-gc.log

建議始終在所有生產服務器中始終啟用GC日志,因為它有助于您排除故障并優化應用程序性能。啟用GC日志只會增加微不足道的開銷。還可以將您的GC日志上傳到垃圾收集日志分析器工具,例如GCeasy,HP JMeter等。這些工具將生成豐富的垃圾收集分析報告。

上圖摘自GCeasy生成的報告。

六、如何禁止GC顯式調用或調整調用GC的頻率?

如果我們就是想避免程序員顯式調用GC,避免不成熟的程序員在不合適時間調用GC,避免人為造成的GC崩潰,該怎么辦?可以通過如下方法:

搜索和替換

在代碼庫中搜索?System.gc()?和Runtime.getRuntime().gc()。如果看到匹配項,則將其刪除。但是這種方法無法避免第三方庫、框架或通過外部源進行調用,那么參考第二種方法。

通過JVM參數強制禁止

通過傳遞JVM參數 ?-XX:+DisableExplicitGC來強制禁止顯式調用。這種方式強制、有效,應用程序內的任何GC顯式代碼調用System.gc()?都將被禁止生效。JVM自身的GC策略不受此參數影響,只禁止人為的觸發GC。

RMI

如果您的應用程序正在使用RMI,則可以控制GC調用的頻率?。啟動應用程序時,可以使用以下JVM參數配置該頻率:

-Dsun.rmi.dgc.server.gcInterval=n

-Dsun.rmi.dgc.client.gcInterval=n

這些屬性的默認值在

JDK 1.4.2和5.0是60000毫秒(即60秒)

JDK 6和更高版本是3600000毫秒(即60分鐘)

如果您的應用主機內存資源非常富余,您可以將這些屬性設置為很高的值,以便可以將GC帶來的對應用程序的影響最小化。這也是應用程序性能優化的一種方式之一。

期待您的關注

本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客。

總結

以上是生活随笔為你收集整理的java 强制gc_java应用性能调优之详解System的gc垃圾回收方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。