成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java應(yīng)用性能調(diào)優(yōu)之詳解System的gc垃圾回收方法

一、什么是System.gc()?

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

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比湟中網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式湟中網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋湟中地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。

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

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

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

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

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

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

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

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

如第二小節(jié)所講:?System.gc()?可以從多個渠道進行的調(diào)用,而不僅僅是從您的應(yīng)用程序源代碼進行的調(diào)用。因此,搜索您的應(yīng)用程序代碼System.gc()?字符串,不足以知道?GC是否正在被調(diào)用。這就構(gòu)成了一個挑戰(zhàn):如何檢測應(yīng)用程序是否正在進行垃圾回收?這就是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)服務(wù)器中始終啟用GC日志,因為它有助于您排除故障并優(yōu)化應(yīng)用程序性能。啟用GC日志只會增加微不足道的開銷。還可以將您的GC日志上傳到垃圾收集日志分析器工具,例如GCeasy,HP JMeter等。這些工具將生成豐富的垃圾收集分析報告。

Java應(yīng)用性能調(diào)優(yōu)之詳解System的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)用。這種方式強制、有效,應(yīng)用程序內(nèi)的任何GC顯式代碼調(diào)用System.gc()?都將被禁止生效。JVM自身的GC策略不受此參數(shù)影響,只禁止人為的觸發(fā)GC。

RMI

如果您的應(yīng)用程序正在使用RMI,則可以控制GC調(diào)用的頻率?。啟動應(yīng)用程序時,可以使用以下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分鐘)

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

標題名稱:Java應(yīng)用性能調(diào)優(yōu)之詳解System的gc垃圾回收方法
路徑分享:http://jinyejixie.com/article10/pddggo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)頁設(shè)計公司、網(wǎng)站制作、域名注冊、自適應(yīng)網(wǎng)站、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)
长汀县| 怀化市| 武穴市| 宁明县| 长武县| 健康| 永寿县| 科尔| 开封市| 通辽市| 梨树县| 台中县| 文登市| 武清区| 鲁山县| 贵南县| 东平县| 饶阳县| 仁寿县| 泽普县| 德化县| 西和县| 峡江县| 牟定县| 弥渡县| 达尔| 昭苏县| 张家川| 明光市| 广水市| 广州市| 南雄市| 响水县| 太仆寺旗| 江门市| 昌宁县| 桓台县| 张家口市| 青龙| 邹平县| 阳城县|