简单的jvm调优
????作為一名勵志成為"神奇寶貝大師"的男人,怎么能連JVM都不懂呢,不然你可能會像智爺那樣,一輩子拿不到冠軍了。
????java能在多平臺運行的基礎就是java虛擬機了,這邊我們不談論它的內存區域,畢竟jdk7的方法區和jdk8元空間還是有區別的。打開idea 點擊右上角 edit configurations 在vm options輸入參數
這邊的禁用是什么原因呢?相信直播間的觀眾應該都是有智慧的!
監視: {} 暫時省略n個字。
線程: {} 暫時省略n個字。
抽樣器: {} 暫時省略n個字。筆者這邊采用docker部署Springboot項目,所以只需要top或者jps就能直接查看到Pid。 lsof -i:端口號,前提是你已經安裝了。 ps -ef | grep 項目名 通過Visual VM發現,基本上每隔8分鐘,jvm就會發生一次GC,而我本人也沒有訪問過項目,項目的訪問量應該為0,所以在沒有定時任務或者死循環的情況下,產生的對象數應該為0。理論上是不會發生GC的。 那么GC是發生在哪里的呢?年輕代還是老年代?
由于這邊NewRatio 為1,所以不管是老年代或者新生代發生gc一般都是在200m左右,我們不好分辨是哪個代。其實之前NewRatio=2,xmx450m,發生GC的情況是150m。因此是新生代發生了GC。 如果不相信,下面是用jstat的截圖,可以看出是新生代對象在不停的產生。 4. 知道是新生代發生了GC,基本上已經證明了上述的猜想:有個死循環。通過抽象分析器發現char對象非常大。 5. 接下來可以通過堆dump發現是哪幾句代碼出現了問題。可以使用jhat這個工具,文件可以通過Visual VM產生,當然在OOM的情況下,也可以通過參數產生。 jhat -J-Xmx1024M file
復制代碼
????java能在多平臺運行的基礎就是java虛擬機了,這邊我們不談論它的內存區域,畢竟jdk7的方法區和jdk8元空間還是有區別的。
jvm參數
//常見參數 -Xms1024m 初始堆大小 -Xmx1024m 最大堆大小 一般將xms和xmx設置為相同大小,防止堆擴展,影響性能。 -XX:NewSize=n:設置年輕代大小 -XX:NewRatio=n:設置年輕代和年老代的比值.如:為3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4 -XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值.注意Survivor區有兩個.如:3,表示Eden:Survivor=3:2,一個Survivor區占整個年輕代的1/5 -XX:MaxPermSize=n:設置持久代大小 -XX:+HeapDumpOnOutOfMemoryError OOM時自動保存堆文件,可以用visualvm分析堆文件//收集器設置 -XX:+UseSerialGC:設置串行收集器 -XX:+UseParallelGC:設置并行收集器 -XX:+UseParalledlOldGC:設置并行年老代收集器 -XX:+UseConcMarkSweepGC:設置并發收集器//垃圾回收統計信息 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename//并行收集器設置 -XX:ParallelGCThreads=n:設置并行收集器收集時使用的CPU數.并行收集//線程數. -XX:MaxGCPauseMillis=n:設置并行收集最大暫停時間 -XX:GCTimeRatio=n:設置垃圾回收時間占程序運行時間的百分比.公式為1/(1+n) //并發收集器設置 -XX:+CMSIncrementalMode:設置為增量模式.適用于單CPU情況. -XX:ParallelGCThreads=n:設置并發收集器年輕代收集方式為并行收集時,使用的CPU數.并行收集線程數. 復制代碼用法
Idea用法
Springboot用法
由于筆者一直用的是Springboot,因此這邊以Springboot的形式進行示范,在啟動項目jar包時添加參數。
java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC newframe-1.0.0.jar 復制代碼工具使用
Visual VM
Visual VM 由java編寫,已經被jdk集成,通過檢測 JVM 中加載的類和對象信息等幫助我們分析內存使用情況,是用來分析java項目 、調優的利器,功能強大。
概述:顯示了項目的jvm參數。這邊的禁用是什么原因呢?相信直播間的觀眾應該都是有智慧的!
監視: {} 暫時省略n個字。
線程: {} 暫時省略n個字。
抽樣器: {} 暫時省略n個字。
jstat
1. 查看項目進程PId
2. 使用命令查看結果
jstat -gcutil 5 1000 復制代碼實戰分析
由于這邊NewRatio 為1,所以不管是老年代或者新生代發生gc一般都是在200m左右,我們不好分辨是哪個代。其實之前NewRatio=2,xmx450m,發生GC的情況是150m。因此是新生代發生了GC。
分析堆dump應該就可以發現了,這邊就不分析了,其實是重啟項目,映射多個端口,然后等待GC,就比較麻煩。為了更加貼近實際,該項目屬于真實項目,已部署到阿里云,鏈接在此,猛戳我,代碼來源于github。
結語
最后祝大家新年快樂,找到好工作。希望小智能拿個冠軍,都看了十幾年了,圓了老玩家的夢吧。
總結
- 上一篇: 错误 LINK : fatal erro
- 下一篇: 计算机的世界:[-bit之魂-]