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

深入理解Java虛擬機(jī)-如何利用VisualVM對(duì)高并發(fā)項(xiàng)目進(jìn)行性能分析

開(kāi)發(fā) 后端
這篇文章就介紹一下如何利用VisualVM進(jìn)行性能分析,以及在分析之前需要知道一些GC優(yōu)化的原則,GC優(yōu)化的目的,以及遇到問(wèn)題時(shí)怎么去解決問(wèn)題的方法。

前面在學(xué)習(xí)JVM的知識(shí)的時(shí)候,一般都需要利用相關(guān)參數(shù)進(jìn)行分析,而分析一般都需要用到一些分析的工具,因?yàn)橐话闶褂肐DEA,而VisualVM對(duì)于IDEA也不錯(cuò),所以就選擇VisualVM來(lái)分析JVM性能,這篇文章就介紹一下如何利用VisualVM進(jìn)行性能分析,以及在分析之前需要知道一些GC優(yōu)化的原則,GC優(yōu)化的目的,以及遇到問(wèn)題時(shí)怎么去解決問(wèn)題的方法。

1 為什么需要

開(kāi)發(fā)大型 Java 應(yīng)用程序的過(guò)程中難免遇到內(nèi)存泄露、性能瓶頸等問(wèn)題,比如文件、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)的連接未釋放,未優(yōu)化的算法等。隨著應(yīng)用程序的持續(xù)運(yùn)行,可能會(huì)造成整個(gè)系統(tǒng)運(yùn)行效率下降,嚴(yán)重的則會(huì)造成系統(tǒng)崩潰。為了找出程序中隱藏的這些問(wèn)題,在項(xiàng)目開(kāi)發(fā)后期往往會(huì)使用性能分析工具來(lái)對(duì)應(yīng)用程序的性能進(jìn)行分析和優(yōu)化。

VisualVM 是一款免費(fèi)的性能分析工具。它通過(guò) jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多種方式從程序運(yùn)行時(shí)獲得實(shí)時(shí)數(shù)據(jù),從而進(jìn)行動(dòng)態(tài)的性能分析。同時(shí),它能自動(dòng)選擇更快更輕量級(jí)的技術(shù)盡量減少性能分析對(duì)應(yīng)用程序造成的影響,提高性能分析的精度。

2 如何安裝

這里有兩種方式:

  •  沒(méi)有按照IDEA插件

如果沒(méi)有按照IDEA插件的話(huà),我們需要找到JDK的按照目錄bin下找到如下執(zhí)行程序。

然后雙擊執(zhí)行,就會(huì)出現(xiàn)界面,如下;

但是,我們一般使用IDEA,所以會(huì)使用插件,就是下面這種方式。

  •  按照IDEA插件

先在插件中找到VisualVM安裝;

安裝了之后,在運(yùn)行的地方就會(huì)多出現(xiàn)兩個(gè)VisualVM的運(yùn)行按鈕;

這樣運(yùn)行程序之后,就可以自動(dòng)打開(kāi)VisualVM程序了。

3 基本介紹

這一部分先對(duì)這個(gè)工具做一個(gè)簡(jiǎn)要的介紹,看看基本有哪些我們會(huì)用到的功能。

在沒(méi)有添加其他插件的時(shí)候,是只有下面幾個(gè)功能的。

3.1 概述

如上圖所示,概述基本上都是我們的系統(tǒng)屬性、運(yùn)行程序時(shí)設(shè)置的JVM參數(shù)等信息的展示,所以,這一部分可以讓我們查看這些信息。

3.2 監(jiān)視

監(jiān)視這個(gè)界面的功能還是很有作用的,可以看到cup運(yùn)行情況、堆的使用情況、類(lèi)的情況以及線(xiàn)程的動(dòng)態(tài)情況。

因此,我們可以利用這個(gè)界面查看cpu情況好不好,更重要的是,我們可以查看堆的使用情況,這對(duì)于我們分析JVM還是非常重要的。

3.3 線(xiàn)程

如上圖所以,可以看到所有的線(xiàn)程的情況,是運(yùn)行、休眠、等待、駐留、監(jiān)視等情況。

注意, 以上這些都不是關(guān)鍵,關(guān)鍵是VisualVM中還有一個(gè)很重要的功能,可以添加插件獲取更多的功能。

3.4 插件添加

正是因?yàn)橛辛瞬寮臄U(kuò)展功能,所以這個(gè)工具才如此強(qiáng)大,VisualVM可以做到以下:

  •  顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置、環(huán)境信息、jps、jinfo。
  •  監(jiān)視應(yīng)用程序的cpu、GC、堆、方法區(qū)以及線(xiàn)程的信息(jstat、jstack)。
  •  dump以及分析堆轉(zhuǎn)存儲(chǔ)快照(jmap、jhat)。
  •  還有很多其他的功能。

在工具->找到可用插件,安裝即可。

下一部分我們就利用已經(jīng)安裝的插件Visual GC進(jìn)行分析。

4 利用Visual GC分析虛擬機(jī)內(nèi)存區(qū)域

這部分會(huì)用到一些Java虛擬機(jī)的一些基礎(chǔ)知識(shí),所以,查看這部分之前,請(qǐng)先查看這篇文章:。

在這個(gè)界面分為以下幾個(gè)部分。

  •  space(Metaspace(元數(shù)據(jù))、Old老年代、新生代(Eden、S0、S1))
  •  Graphs(Compile Time(編譯時(shí)間)、Class Loader Time(類(lèi)加載時(shí)間)、GC Time(垃圾收集時(shí)間)、Eden Space、Survivor 0、Survivor 1、Old Gen、Metaspace)
  •  Histogram(Parameters參數(shù)設(shè)置)

那么知道這些參數(shù)之后,怎么去分析虛擬機(jī)到底運(yùn)行是好是壞呢,這個(gè)時(shí)候,我們需要了解一些Java虛擬機(jī)基礎(chǔ)的優(yōu)化知識(shí)。

首先,需要了解一些GC優(yōu)化的原則。

  •  多數(shù)的Java應(yīng)用不需要在服務(wù)器上進(jìn)行GC優(yōu)化;
  •  多數(shù)導(dǎo)致GC問(wèn)題的Java應(yīng)用,都不是因?yàn)槲覀儏?shù)設(shè)置錯(cuò)誤,而是代碼問(wèn)題;
  •  在應(yīng)用上線(xiàn)之前,先考慮將機(jī)器的JVM參數(shù)設(shè)置到最優(yōu)(最適合);
  •  減少創(chuàng)建對(duì)象的數(shù)量;
  •  減少使用全局變量和大對(duì)象;
  •  GC優(yōu)化是到最后不得已才采用的手段;
  •  在實(shí)際使用中,分析GC情況優(yōu)化代碼比優(yōu)化GC參數(shù)要多得多;

另外,我們需要知道我們GC優(yōu)化的目的。

  •  將轉(zhuǎn)移到老年代的對(duì)象數(shù)量降低到最小;
  •  減少full GC的執(zhí)行時(shí)間;

一般,我們需要執(zhí)行的有以下幾點(diǎn);

  •  減少使用全局變量和大對(duì)象;
  •  調(diào)整新生代的大小到最合適;
  •  設(shè)置老年代的大小為最合適;
  •  選擇合適的GC收集器;

至于怎么算合適,后面我會(huì)通過(guò)一個(gè)實(shí)例講解。

其實(shí),如果想要知道更多JVM內(nèi)存分配和回收策略的原理,可以查看這篇文章:JVM內(nèi)存分配和回收策略的原理

一般我們執(zhí)行了我們的程序之后,接下來(lái)就是需要查看GC的狀態(tài)了,接著分析結(jié)果,判斷是否需要進(jìn)行優(yōu)化。

一般如果達(dá)到以下的指標(biāo),就不需要進(jìn)行GC了。

  •  Minor GC執(zhí)行時(shí)間不到50ms,Minor GC執(zhí)行不頻繁,約10秒一次;
  •  Full GC執(zhí)行時(shí)間不到1s,F(xiàn)ull GC執(zhí)行頻率不算頻繁,不低于10分鐘1次;

實(shí)例 1

我們先看一個(gè)GC狀態(tài)需要優(yōu)化的例子,在這個(gè)實(shí)例中,我們給堆分配的最大最小的值都是64M(很小的堆大小)。

  • GC狀態(tài)差情況分析 
  1. /**  
  2.  * VM Args:-Xms64m -Xmx64m -XX:+HeapDumpOnOutOfMemoryError  
  3.  * @author 歐陽(yáng)思海  
  4.  */  
  5. public class HeapTest {  
  6.     static class StaticObject {  
  7.     }  
  8.     public static void main(String[] args) {  
  9.         List<StaticObject> list = new ArrayList<StaticObject>();  
  10.         int i = 1 
  11.         //不斷的向堆中添加對(duì)象  
  12.         while (true) {  
  13.             list.add(new StaticObject());  
  14.             i++;  
  15.             System.out.println(i);  
  16.             System.out.println(list.size());  
  17.         }  
  18.     }  

由于分配的堆內(nèi)存太小,所以導(dǎo)致,堆溢出。

接著我們查看一下Visual GC的監(jiān)視情況。

  •  監(jiān)視界面情況

我們可以從堆的使用情況看出,基本已經(jīng)使用完。

  •  Visual GC監(jiān)視情況

從上圖可知,在短短的運(yùn)行時(shí)間中,Eden進(jìn)行了49次GC,雖然時(shí)間短,但是能說(shuō)明一個(gè)問(wèn)題,新生代堆內(nèi)存分配的空間太小,導(dǎo)致頻繁GC。

同時(shí),Old老年代也進(jìn)行了33次GC,雖然運(yùn)行時(shí)間也在不需要優(yōu)化的范圍內(nèi),而且從Survivor可以看出,基本沒(méi)有GC,說(shuō)明這些都是大對(duì)象,直接進(jìn)入到了Old老年代,導(dǎo)致GC頻繁。

所以,我們需要進(jìn)行的優(yōu)化就是加大新生代和老年代堆內(nèi)存的大小,同時(shí)減少大對(duì)象的產(chǎn)生。

參數(shù)優(yōu)化分析

我們將VM參數(shù)改為:-Xms512m -Xmx512m -Xmn128m -XX:+HeapDumpOnOutOfMemoryError,運(yùn)行大概5分鐘再次查看結(jié)果。

首先沒(méi)有出現(xiàn)堆內(nèi)存溢出。

  •  監(jiān)視情況

加大了堆內(nèi)存,所以堆內(nèi)存沒(méi)有出現(xiàn)問(wèn)題。

  •  Visual GC監(jiān)視情況

加大了堆內(nèi)存之后,Eden新生代進(jìn)行了66次GC,使用時(shí)間3.381s基本滿(mǎn)足要求(執(zhí)行時(shí)間不到50ms,Minor GC執(zhí)行不頻繁,約10秒一次),同時(shí)老年代old進(jìn)行了2次GC,使用時(shí)間4.127s,這里還是有待優(yōu)化的,不太滿(mǎn)足優(yōu)化要求。

  •  dump文件分析

點(diǎn)擊堆 dump這個(gè)按鈕就會(huì)生成 dump文件,我們可以分析類(lèi)及對(duì)象的一些情況。

分析之后發(fā)現(xiàn),StaticObject對(duì)象大多,沒(méi)有進(jìn)行GC,問(wèn)題主要在這里,所以,下一步需要解決這個(gè)問(wèn)題。

通過(guò)以上分析可以說(shuō)明一個(gè)問(wèn)題,加大了堆內(nèi)存之后,新生代和老年代的GC情況大大的改善了,但是還有大對(duì)象的問(wèn)題,所以還有待優(yōu)化。

  • 修改大對(duì)象,進(jìn)行GC

修改程序,如下: 

  1. /**  
  2.  * VM Args:-Xms512m -Xmx512m -Xmn128m -XX:+HeapDumpOnOutOfMemoryError  
  3.  *  
  4.  * @author 歐陽(yáng)思海  
  5.  */  
  6. public class HeapTest {  
  7.    /* static class StaticObject {  
  8.     }*/  
  9.     public static void main(String[] args) {  
  10.         int i = 1 
  11.         while (true) {  
  12.             i++;  
  13.             System.out.println(i);  
  14.         }  
  15.     }  
  •  監(jiān)視情況

堆一直運(yùn)行良好。

  •  Visual GC監(jiān)視情況

這次相對(duì)于上次相比,老年代的情況已經(jīng)改善了,沒(méi)有GC,說(shuō)明大對(duì)象不存在了。

通過(guò)上面的分析跟優(yōu)化,就滿(mǎn)足GC的需求了,不需要再優(yōu)化了。

5 總結(jié)

通過(guò)上面的分析及使用,VisualVM基本的使用以及如何利用VisualVM進(jìn)行Java虛擬機(jī)優(yōu)化相信你已經(jīng)掌握了,如果還想了解更過(guò)關(guān)于Java虛擬機(jī)的知識(shí)及優(yōu)化文章,請(qǐng)看本系列的其他文章。

    1、原創(chuàng)不易,老鐵,文章需要你的 點(diǎn)贊 讓更多的人看到,希望能夠幫助到大家!

    2、文章有不當(dāng)之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號(hào):好好學(xué)java,公眾號(hào)已有 6W 粉絲。 

 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2019-07-24 16:04:47

Java虛擬機(jī)并發(fā)

2012-11-14 09:57:46

JavaJava虛擬機(jī)JVM

2024-03-29 11:42:21

Java虛擬機(jī)

2024-04-03 13:49:00

Java虛擬機(jī)方法區(qū)

2016-09-01 12:37:13

OpenStack虛擬機(jī)Metadata

2021-01-26 09:30:32

加密虛擬機(jī)攻擊

2024-03-26 07:30:07

Java虛擬機(jī)源文件

2023-09-22 23:00:11

Java虛擬機(jī)

2024-04-10 07:40:45

Java虛擬機(jī)內(nèi)存

2019-04-08 16:50:33

前端性能監(jiān)控

2024-02-28 11:33:01

云服務(wù)開(kāi)發(fā)

2024-12-31 09:00:12

Java線(xiàn)程狀態(tài)

2009-06-12 16:15:42

死鎖Java虛擬機(jī)

2020-11-13 08:42:24

Synchronize

2020-12-11 07:32:45

編程ThreadLocalJava

2016-10-26 20:49:24

ReactJavascript前端

2013-11-19 14:05:08

VDP虛擬機(jī)

2018-07-09 15:11:14

Java逃逸JVM

2022-10-12 07:53:46

并發(fā)編程同步工具

2014-05-22 15:21:46

Libguestfs虛擬機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本成人中文字幕 | 国产在线观看福利 | 亚洲女人天堂成人av在线 | 国产1区| 第一区在线观看免费国语入口 | 久草中文网 | 国产精品久久久久一区二区三区 | 日韩欧美三区 | h漫在线观看 | 精品日韩一区 | av性色全交蜜桃成熟时 | 九九久久精品视频 | 欧美激情va永久在线播放 | 国产视频久久 | 日韩欧美大片 | 久久99精品久久久久久国产越南 | 亚洲成人天堂 | 日本福利视频 | 天堂三级| 成人午夜免费福利视频 | 日本欧美在线视频 | 午夜欧美 | 玖玖视频免费 | 中文一区二区视频 | 91在线视频观看免费 | 亚洲 中文 欧美 日韩 在线观看 | 在线观看成人小视频 | 放个毛片看看 | 麻豆精品一区二区三区在线观看 | 久久精品91 | 成人国产一区二区三区精品麻豆 | 国产视频精品视频 | 精品中文视频 | 成年人黄色一级毛片 | 91精品国产99 | 黄a在线播放 | 欧美视频二区 | 欧美a免费 | 久久久久久国产 | 久久久久国产 | 精品美女在线观看视频在线观看 |