成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

開發 前端
在前面整理了一篇關于JVM故障診斷和處理工具,考慮到大部分的Java程序員都使用的時IntelliJ Idea,本篇就使用工具來實戰演練對IntelliJ Idea運行速度調優

 前言

在前面整理了一篇關于JVM故障診斷和處理工具,考慮到大部分的Java程序員都使用的時IntelliJ Idea,本篇就使用工具來實戰演練對IntelliJ Idea運行速度調優

調優前的運行狀態

原始配置內容

要查詢idea原始配置文件的路徑可以在VisualVM中的概述中查看

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

原始配置內容:

  1. -XX:ReservedCodeCacheSize=240m 
  2. -XX:+UseCompressedOops 
  3. -Dfile.encoding=UTF-8 
  4. -XX:SoftRefLRUPolicyMSPerMB=50 
  5. -ea 
  6. -Dsun.io.useCanonCaches=false 
  7. -Djava.net.preferIPv4Stack=true 
  8. -Djdk.http.auth.tunneling.disabledSchemes="" 
  9. -XX:+HeapDumpOnOutOfMemoryError 
  10. -XX:-OmitStackTraceInFastThrow 
  11.  
  12. -XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log 
  13. -XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof 
  14.  
  15. -Xmx512m 

打印啟動時間插件開發

需要直觀地看到優化前和優化后啟動時間的變化,所以需要簡單做一個Idea的插件開發,關于Idea插件開發的流程建議參考我以前的文章《IDEA插件:多線程文件下載插件開發 》

JVM的啟動時間到所有組件初始化完成后的時間就看做是IDEA的啟動時間,代碼如下

  1. public class MyApplicationInitializedListener implements ApplicationInitializedListener { 
  2.     @Override 
  3.     public void componentsInitialized() { 
  4.         RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean(); 
  5.         long startTime = bean.getStartTime(); 
  6.         long costTime = System.currentTimeMillis() - startTime; 
  7.  
  8.         Messages.showMessageDialog("毫秒:" + costTime, "啟動耗時", Messages.getInformationIcon()); 
  9.     } 

plugin.xml中添加如下代碼:

  1. <extensions defaultExtensionNs="com.intellij"
  2.     <applicationInitializedListener id="MyApplicationInitializedListener" 
  3.                                     implementation="cn.silently9527.MyApplicationInitializedListener"/> 
  4. </extensions> 

優化前的啟動信息與時間消耗

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑
JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

根據VisualGC和IDEA啟動插件收集到的信息:

  • IDEA啟動耗時 15s
  • 總共垃圾收集22次,耗時1.2s,其中新生代GC 17次,耗時324ms; 老年代GC 5次,耗時953ms
  • 加載類27526個,耗時 21s

按照這個數據來看也算是正常,15s 其實也在接受范圍內,由于本文主要演示性能調優,所以需要測試能否再快一些

開始嘗試優化

調整內存來控制垃圾回收頻率

圖上我們可以看出,啟動參數指定的512m的內存被分配到新生代的只有169m,由于IDEA是我們開發常用的工具,平時的編譯過程也需要足夠的內存,所以我們需要先把總的內存擴大,這里我設置最大的內存-Xmx1024m,為了讓JVM在GC期間不需要再浪費時間再動態計算擴容大小,同時也設置了-Xms1024m;

在啟動的過程中Eden共發生了17次GC,為了減少新生代gc次數,我把新生代的內存大小設置成-Xmn256m;

重新啟動之后查看VisualGC,新生代gc次數從 17次 降低到了 7次,耗時從 324ms 降低到了 152ms。

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

在調整內存前發生了5次Full GC,調整內存后的依然還是有4次Full GC,但是從兩張圖我們可以看出,老年代的空間還有很多剩余,是不應該發生Full GC的;考慮是否是代碼中有地方手動調用System.gc()觸發了Full GC,所以添加了參數-XX:+DisableExplicitGC,再次重新啟動IDEA,結果很失望,依然還有4次Full GC;

再次仔細觀察優化前的圖,注意看 Last Cause: Metadata GC Threshold , 最后一次gc是應該Metaspace區域內存不夠發生的GC,為了驗證我們的猜想,打印出GC日志來看看。在idea.vmoptions中添加打印日志相關的參數:

  1. -XX:+PrintGCDetails 
  2. -XX:+PrintGCDateStamps 
  3. -Xloggc:../gc.log 

JVM的GC日志的主要參數包括如下幾個:

-XX:+PrintGC 輸出GC日志

-XX:+PrintGCDetails 輸出GC的詳細日志

-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)

-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在進行GC的前后打印出堆的信息

-Xloggc:../logs/gc.log 日志文件的輸出路徑

重新啟動idea,查看gc.log

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

其中PSYoungGen:表示新生代使用的ParallelScavenge垃圾收集器,31416K->0K(181248K)表示 gc前已使用的內存大小 -> gc后已使用內存大?。ㄔ搮^域的總內存大小)

從日志中我們看出每次Full GC都是因為Metadata GC Threshold,而Metaspace每次gc回收的內存幾乎沒有,僅僅是擴大了該區域的容量;找到了原因那就好辦了,添加如下的參數調整Metaspace的大小:

  1. -XX:MetaspaceSize=256m 

再次重啟Idea之后,發現Full GC沒有了,心情很爽

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

測試打開大項目點擊編譯代碼,發現自己的idea卡死了,查看VisualGC之后發現堆內存都還有空閑,只有Metaspace被全部占滿了,所以是自己給的最大空間設置太小,所以直接去掉了-XX:MaxMetaspaceSize=256m

選擇垃圾收集器

從剛才的gc日志中,我們可以發現默認使用的是ParallelScavenge + Parallel Old垃圾收集器,這個組合注重的是吞吐量,這里我們嘗試換一個注重低延時的垃圾收集器試一試

  • ParNew + CMS 在idea.vmoptions中添加如下配置:
  1. -XX:+UseConcMarkSweepGC 
  2. -XX:+UseParNewGC 

重啟IDEA之后查看VisualGC

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

很尷尬,同樣發生了6次gc,ParallelScavenge + Parallel Old的組合耗時197ms,而ParNew + CMS的組合耗時379ms;雖然是這個結果,但是我們需要考慮當前只發生了MinorGC,如果發生FullGC了結果又會如何了,大家可以自己測試一下

  • G1 我們再換一個最新的G1垃圾回收器試試,在idea.vmoptions中添加如下配置:
  1. -XX:+UseG1GC 
JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

這個結果好像也還是要慢一點點,自己多次測試過這兩個垃圾回收器,雖然每次結果都不一樣,相差不遠,所以垃圾回收器可以自己選擇,這里我們選擇的是G1

類加載時間優化

根據之前的分析,idea啟動加載類27526個,耗時 21s,這個我們有辦法能優化一下嗎?因為idea是常用的開發工具,經常很多人的使用,我們可以認為它的代碼是安全的,是否符合當前虛擬機的要求,不會危害虛擬機的安全,所以我們使用參數-Xverify:none來禁用字節碼的驗證過程

重啟IDEA

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

耗時下降到了11s,效果還是比較明顯的

總結

做完了所有優化之后,經過多次重啟測試,平均的啟動時間下降到了11s,為了安慰我本次操作沒有白辛苦,搞一張11s以下的圖

JVM性能調優實戰:讓你的IntelliJ Idea縱享絲滑

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2024-03-26 10:30:37

Mybatis擴展庫API

2022-03-18 13:59:46

緩存RedisCaffeine

2024-12-04 15:49:29

2022-12-20 09:09:27

ViteWebpack

2017-07-21 08:55:13

TomcatJVM容器

2020-11-09 07:34:49

JVM性能監控

2023-06-26 08:01:42

debugger技巧代碼

2023-09-07 07:35:59

JS操作網頁

2023-11-30 18:03:55

IDEA工具

2009-09-04 17:57:15

Glassfish性能Java EE

2019-02-19 10:25:28

JVM性能工具

2023-04-24 14:54:09

JVM性能調優

2021-11-17 08:16:03

內存控制Go

2023-03-15 15:54:36

Java代碼

2022-08-28 10:08:53

前端代碼前端

2012-01-10 14:35:08

JavaJVM

2021-12-06 11:03:57

JVM性能調優

2022-09-14 22:58:58

Push 推薦Java 開發vivo

2019-11-01 08:49:07

JVM監控性能

2023-09-27 07:49:23

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区视频 | 九九九视频在线 | 一区二区三区四区在线 | 色综合一区二区三区 | 久久国产精品-久久精品 | 91久久国产综合久久 | 99精品欧美一区二区三区综合在线 | 在线视频一区二区 | 久久久久国产精品免费免费搜索 | 国产视频在线观看一区二区三区 | 亚洲91精品| 亚洲a视 | 日韩二区三区 | 精品视频一区二区在线观看 | 在线看亚洲 | 欧美日高清视频 | 久久99网 | 国产精品美女久久久久久久久久久 | 青青草网| 亚洲一区二区三区四区五区午夜 | 久久国产精品免费一区二区三区 | 亚洲三级在线观看 | 天天弄| 久久综合一区 | 日日夜夜天天综合 | 国产精品视频网站 | 欧美国产日韩在线观看成人 | 亚洲国产网址 | 国产一区二 | 激情小说综合网 | 91久久精品日日躁夜夜躁欧美 | 欧美极品少妇xxxxⅹ免费视频 | 亚洲午夜精品一区二区三区 | 亚洲日本欧美日韩高观看 | 91在线观看免费视频 | 九九久久精品 | 麻豆久久久9性大片 | 狠狠躁18三区二区一区 | 国产欧美日韩在线播放 | 国产成人精品久久 | 三区在线 |