最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM性能調(diào)優(yōu)實(shí)戰(zhàn):讓你的IntelliJ Idea縱享絲滑

 更新時(shí)間:2021年01月18日 10:38:56   投稿:mrr  
這篇文章主要介紹了JVM性能調(diào)優(yōu)實(shí)戰(zhàn):讓你的IntelliJ Idea縱享絲滑的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本文已被Github倉庫收錄 https://github.com/silently9527/JavaCore

前言

在前面整理了一篇關(guān)于JVM故障診斷和處理工具,考慮到大部分的Java程序員都使用的是IntelliJ Idea,本篇就使用工具來實(shí)戰(zhàn)演練對IntelliJ Idea運(yùn)行速度調(diào)優(yōu)

調(diào)優(yōu)前的運(yùn)行狀態(tài)

 原始配置內(nèi)容

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

原始配置內(nèi)容:

-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
-Dfile.encoding=UTF-8
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof

-Xmx512m

打印啟動(dòng)時(shí)間插件開發(fā)

需要直觀的看到優(yōu)化前和優(yōu)化后啟動(dòng)時(shí)間的變化,所以需要簡單做一個(gè)Idea的插件開發(fā),關(guān)于Idea插件開發(fā)的流程建議參考我以前的文章《IDEA插件:多線程文件下載插件開發(fā)》

JVM的啟動(dòng)時(shí)間到所有組件初始化完成后的時(shí)間就看做是IDEA的啟動(dòng)時(shí)間,代碼如下

public class MyApplicationInitializedListener implements ApplicationInitializedListener {
  @Override
  public void componentsInitialized() {
    RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
    long startTime = bean.getStartTime();
    long costTime = System.currentTimeMillis() - startTime;

    Messages.showMessageDialog("毫秒:" + costTime, "啟動(dòng)耗時(shí)", Messages.getInformationIcon());
  }
}

plugin.xml中添加如下代碼:

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

優(yōu)化前的啟動(dòng)信息與時(shí)間消耗

根據(jù)VisualGC和IDEA啟動(dòng)插件收集到的信息:

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

按照這個(gè)數(shù)據(jù)來看也算是正常,15s 其實(shí)也在接受范圍內(nèi),由于本文主要演示性能調(diào)優(yōu),所以需要測試能否在快一些

開始嘗試優(yōu)化

調(diào)整內(nèi)存來控制垃圾回收頻率

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

在啟動(dòng)的過程中Eden共發(fā)生了17次GC,為了減少新生代gc次數(shù),我把新生代的內(nèi)存大小設(shè)置成 -Xmn256m ;

重新啟動(dòng)之后查看VisualGC,新生代gc次數(shù)從 17次 降低到了 7次,耗時(shí)從 324ms 降低到了 152ms。

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

再次仔細(xì)觀察優(yōu)化前的圖,注意看 Last Cause: Metadata GC Threshold , 最后一次gc是應(yīng)該Metaspace區(qū)域內(nèi)存不夠發(fā)生的GC,為了驗(yàn)證我們的猜想,打印出GC日志來看看。在 idea.vmoptions 中添加打印日志相關(guān)的參數(shù):

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:../gc.log

JVM的GC日志的主要參數(shù)包括如下幾個(gè):

  • -XX:+PrintGC 輸出GC日志
  • -XX:+PrintGCDetails 輸出GC的詳細(xì)日志
  • -XX:+PrintGCTimeStamps 輸出GC的時(shí)間戳(以基準(zhǔn)時(shí)間的形式)
  • -XX:+PrintGCDateStamps 輸出GC的時(shí)間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
  • -XX:+PrintHeapAtGC 在進(jìn)行GC的前后打印出堆的信息
  • -Xloggc:../logs/gc.log 日志文件的輸出路徑

重新啟動(dòng)idea,查看gc.log

其中 PSYoungGen: 表示新生代使用的ParallelScavenge垃圾收集器, 31416K->0K(181248K) 表示 gc前已使用的內(nèi)存大小 -> gc后已使用內(nèi)存大小(該區(qū)域的總內(nèi)存大?。?/p>

從日志中我們看出每次Full GC都是因?yàn)?Metadata GC Threshold ,而Metaspace每次gc回收的內(nèi)存幾乎沒有,僅僅是擴(kuò)大了該區(qū)域的容量;找到了原因那就好辦了,添加如下的參數(shù)調(diào)整Metaspace的大小:

-XX:MetaspaceSize=256m

再次重啟Idea之后,發(fā)現(xiàn)Full GC沒有了,心情很爽

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

選擇垃圾收集器

從剛才的gc日志中,我們可以發(fā)現(xiàn)默認(rèn)使用的是ParallelScavenge + Parallel Old垃圾收集器,這個(gè)組合注重的是吞吐量,這里我們嘗試換一個(gè)注重低延時(shí)的垃圾收集器試一試

ParNew + CMS

idea.vmoptions 中添加如下配置:

-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC

重啟IDEA之后查看VisualGC

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

G1

我們在換一個(gè)最新的G1垃圾回收器試試,在 idea.vmoptions 中添加如下配置:

-XX:+UseG1GC

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

類加載時(shí)間優(yōu)化

根據(jù)之前的分析,idea啟動(dòng)加載類27526個(gè),耗時(shí) 21s,這個(gè)我們有辦法能優(yōu)化一下嗎?因?yàn)閕dea是常用的開發(fā)工具,經(jīng)常很多人的使用,我們可以認(rèn)為它的代碼是安全的,是否符合當(dāng)前虛擬機(jī)的要求,不會(huì)危害虛擬機(jī)的安全,所以我們使用參數(shù) -Xverify:none 來禁用字節(jié)碼的驗(yàn)證過程

重啟IDEA

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

總結(jié)

做完了所有優(yōu)化之后,經(jīng)過多次重啟測試,平均的啟動(dòng)時(shí)間下降到了11s,為了安慰我本次操作沒有白辛苦,搞一張11s以下的圖

我已經(jīng)從零開始手寫了簡易版springmvc,以及編寫了詳細(xì)的說明文檔,希望能夠幫助伙伴們深入理解springmvc核心原理.

源碼獲取地址:我把開源的項(xiàng)目代碼都已經(jīng)放到了Git倉庫,Github倉庫地址:https://github.com/silently9527 ,碼云倉庫地址:https://gitee.com/silently9527 ,

到此這篇關(guān)于JVM性能調(diào)優(yōu)實(shí)戰(zhàn):讓你的IntelliJ Idea縱享絲滑的文章就介紹到這了,更多相關(guān)JVM性能調(diào)優(yōu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊

    深入淺析Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊

    這篇文章主要介紹了Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊的相關(guān)資料,靜態(tài)代碼塊>Main()>構(gòu)造代碼塊 。非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • 學(xué)習(xí)Java內(nèi)存模型JMM心得

    學(xué)習(xí)Java內(nèi)存模型JMM心得

    這篇文章主要介紹了學(xué)習(xí)Java內(nèi)存模型JMM的心得以及對其原理做了深入的介紹,有興趣的朋友學(xué)習(xí)下吧。
    2017-12-12
  • SpringBoot整合Jackson超詳細(xì)用法(附Jackson工具類)

    SpringBoot整合Jackson超詳細(xì)用法(附Jackson工具類)

    這篇文章主要介紹了SpringBoot整合Jackson超詳細(xì)教程,本篇講的是Jackson的詳細(xì)用法,Jackson工具類在文章最后,直接復(fù)制粘貼即可使用,需要的朋友可以參考下
    2023-03-03
  • Java時(shí)間輪調(diào)度算法的代碼實(shí)現(xiàn)

    Java時(shí)間輪調(diào)度算法的代碼實(shí)現(xiàn)

    時(shí)間輪是一種高效的定時(shí)調(diào)度算法,主要用于管理延時(shí)任務(wù)或周期性任務(wù),它通過一個(gè)環(huán)形數(shù)組(時(shí)間輪)和指針來實(shí)現(xiàn),將大量定時(shí)任務(wù)分?jǐn)偟焦潭ǖ臅r(shí)間槽中,極大地降低了時(shí)間復(fù)雜度和資源開銷,本文給大家介紹了Java時(shí)間輪調(diào)度算法的代碼實(shí)現(xiàn),需要的朋友可以參考下
    2025-03-03
  • SpringBoot3整合Swagger3時(shí)出現(xiàn)Type javax.servlet.http.H的ttpServletRequest not present錯(cuò)誤解決方法

    SpringBoot3整合Swagger3時(shí)出現(xiàn)Type javax.servlet.http.H的ttpSe

    這篇文章主要介紹了SpringBoot3整合Swagger3時(shí)出現(xiàn)Type javax.servlet.http.H的ttpServletRequest not present錯(cuò)誤解決方法,文中有詳細(xì)的解決方法,需要的朋友可以參考下
    2025-01-01
  • Java使用SFTP上傳文件到服務(wù)器的簡單使用

    Java使用SFTP上傳文件到服務(wù)器的簡單使用

    這篇文章主要介紹了Java使用SFTP上傳文件到服務(wù)器的簡單使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • mybatis單元測試過程(無需啟動(dòng)容器)

    mybatis單元測試過程(無需啟動(dòng)容器)

    在MyBatis中,單元測試無需啟動(dòng)容器即可進(jìn)行,主要涉及Configuration類、Executor接口及其實(shí)現(xiàn)類,以及XMLMapperBuilder的作用,Configuration類是配置的承載者,負(fù)責(zé)初始化并解析配置文件,Executor接口及其實(shí)現(xiàn)類
    2024-09-09
  • SpringBoot報(bào)錯(cuò)Invalid?bound?statement?(not?found)問題排查和解決方案

    SpringBoot報(bào)錯(cuò)Invalid?bound?statement?(not?found)問題排查和解決方案

    這篇文章主要介紹了SpringBoot報(bào)錯(cuò)Invalid?bound?statement?(not?found)問題排查和解決方案,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • SpringBoot整合WebService服務(wù)的實(shí)現(xiàn)代碼

    SpringBoot整合WebService服務(wù)的實(shí)現(xiàn)代碼

    WebService是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語言,不依賴于平臺(tái),可以實(shí)現(xiàn)不同的語言間的相互調(diào)用,通過Internet進(jìn)行基于Http協(xié)議的網(wǎng)絡(luò)應(yīng)用間的交互,這篇文章主要介紹了SpringBoot整合WebService服務(wù)的實(shí)例代碼,需要的朋友可以參考下
    2022-02-02
  • SpringBoot臨時(shí)屬性設(shè)置方法

    SpringBoot臨時(shí)屬性設(shè)置方法

    這篇文章主要介紹了SpringBoot臨時(shí)屬性設(shè)置方法,SpringBoot工程可以基于java環(huán)境獨(dú)立進(jìn)行jar文件啟動(dòng)服務(wù),文中給大家提到了命令行啟動(dòng)常見問題以及解決方案,需要的朋友可以參考下
    2022-09-09

最新評論

北票市| 宁强县| 临泽县| 茂名市| 建始县| 蒲城县| 平原县| 霍城县| 永济市| 南乐县| 个旧市| 天津市| 尚义县| 乌拉特后旗| 海丰县| 布尔津县| 东丰县| 玉屏| 易门县| 庄浪县| 正安县| 隆昌县| 朝阳县| 乃东县| 龙井市| 娱乐| 阳原县| 晋宁县| 任丘市| 巴南区| 曲靖市| 临桂县| 姜堰市| 科尔| 白沙| 峡江县| 鹰潭市| 沙田区| 宁蒗| 义乌市| 屏山县|