欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java性能調(diào)優(yōu)System的gc垃圾回收方法

 更新時間:2022年03月16日 09:53:44   作者:字母哥哥  
這篇文章主要為大家介紹了java性能調(diào)優(yōu)System的gc垃圾回收方法示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

一、什么是System.gc()?

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

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

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

  • 您自己開發(fā)的應用程序可以顯式的調(diào)用 System.gc() 方法。
  •  System.gc() 也可以由您的第三方庫,框架觸發(fā)。
  • 可以由外部工具(如VisualVM)通過使用JMX觸發(fā)
  • 如果您的應用程序使用了RMI,RMI會定期調(diào)用 System.gc() 。

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

當 System.gc() 或 Runtime.getRuntime().gc()API被調(diào)用時,將觸發(fā)完整的GC事件。在GC完成之前,整個JVM將凍結(即正在運行的所有服務將被暫停),通常完整的GC需要很長時間才能完成。因此在不合適的時間運行GC,將導致不良的用戶體驗,甚至是崩潰。JVM具有復雜的算法,該算法始終在后臺運行,進行所有計算以及有關何時觸發(fā)GC的計算。當您顯式調(diào)用System.gc()調(diào)用時,所有這些計算都將被拋掉。

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

GC操作應該由JVM自行控制,在絕大部分的場景都不建議程序員手動寫代碼顯式進行System.gc()操作,但是也不排除其中個別例外:在我們開發(fā)多個微服務時,每個服務都有多個備份節(jié)點。在非業(yè)務高峰時段,我們可以從微服務-負載均衡的節(jié)點池中取出其中一個JVM實例。然后通過該JVM上的JMX顯式觸發(fā)System.gc()調(diào)用,一旦GC事件完成并且從內(nèi)存中清除了垃圾,將該JVM放回到微服務-負載均衡的節(jié)點池中。當然這個過程需要很好的微服務管理及服務發(fā)布機制配合,這樣既能保證JVM垃圾內(nèi)存的有效清理,又不影響業(yè)務的正常運行。

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

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

// java 8 啟用GC日志:
// -XX: PrintGCDetails -Xloggc:<gc-log-file-path> ,例如下面這行代碼
-XX: PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log
// java 9 啟用GC日志:-Xlog:gc*:file=<gc-log-file-path> ,例如下面這行代碼
-Xlog:gc*:file=/opt/tmp/myapp-gc.log

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

GCeasy.io工具報告的GC原因

上圖摘自GCeasy生成的報告。

六、如何禁止GC顯式調(diào)用或調(diào)整調(diào)用GC的頻率?

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

搜索和替換

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

通過JVM參數(shù)強制禁止

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

RMI

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

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

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

這些屬性的默認值在

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

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

以上就是java性能調(diào)優(yōu)System的gc垃圾回收方法的詳細內(nèi)容,更多關于java性能調(diào)優(yōu)Systemgc垃圾回收的資料請關注腳本之家其它相關文章!

相關文章

  • 淺析idea生成war包放入tomcat的路徑訪問問題

    淺析idea生成war包放入tomcat的路徑訪問問題

    這篇文章主要介紹了關于idea 生成war 包放入tomcat的路徑訪問問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Javamail使用過程中常見問題解決方案

    Javamail使用過程中常見問題解決方案

    這篇文章主要介紹了Javamail使用過程中常見問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java面試基礎之TCP連接以及其優(yōu)化

    Java面試基礎之TCP連接以及其優(yōu)化

    這篇文章主要給大家介紹了關于Java面試基礎之TCP連接以及其優(yōu)化的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • 以實例講解Objective-C中的KVO與KVC機制

    以實例講解Objective-C中的KVO與KVC機制

    這篇文章主要介紹了以實例講解Objective-C中的KVO與KVC機制,即Key-Value-Observing與Key-Value-Coding,需要的朋友可以參考下
    2015-09-09
  • Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案

    Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案

    這篇文章主要介紹了Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java多線程編程中synchronized線程同步的教程

    Java多線程編程中synchronized線程同步的教程

    Java的synchronized關鍵字可以修飾方法和對象來構建線程間的同步,這里我們就來共同學習Java多線程編程中synchronized線程同步的教程:
    2016-07-07
  • JavaFx實現(xiàn)拼圖游戲

    JavaFx實現(xiàn)拼圖游戲

    這篇文章主要為大家詳細介紹了JavaFx實現(xiàn)拼圖游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法

    Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法

    這篇文章主要介紹了Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法的相關資料,需要的朋友可以參考下
    2017-03-03
  • Java中使用阻塞隊列控制線程集實例

    Java中使用阻塞隊列控制線程集實例

    這篇文章主要介紹了Java控制阻塞隊列線程集實例,本文用一個程序展示了如何使用阻塞隊列來控制線程集,程序功能是在一個目錄及它的所有子目錄下搜索所有文件,打印出包含指定關鍵字的文件列表,需要的朋友可以參考下
    2015-01-01
  • Java中notify和notifyAll的區(qū)別及何時使用

    Java中notify和notifyAll的區(qū)別及何時使用

    本文主要介紹了Java中notify和notifyAll的區(qū)別及何時使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論