VisualVM是JDK自帶的運行監視和故障處理程序,能夠很直觀的查看Java虛擬機的信息和運行狀況,這裏咱們以Android Studio爲例,簡單看看VisualVM的應用
首先要找到本地JDK的路徑
- 在終端輸入:java -verbose,獲得JDK路徑
- 在終端輸入:open + JDK路徑,打開JDK所在文件夾
- 找到jvisualvm,雙擊執行便可打開VisualVM
VisualVM初探
-
打開Android Studio之後,咱們從上圖中就能看到左上角Android Studio的進程,雙擊能夠查看詳細的信息,如上圖html
-
在「概述」一欄下面,咱們能夠從「JVM參數」一項中看到虛擬機的具體設置,好比Java堆的大小,是否開啓字節碼驗證,採用的垃圾收集器等java
-
其中的JConsole 和Visual GC是插件,須要另外安裝。git
-
安裝插件:頂部工具-->插件,打開插件面板 github
-
插件的安裝分爲在線安裝和手動安裝,推薦用在線安裝。在線安裝首先要在「設置」選項卡里面添加新的更新配置,配置好如圖的連接,由於默認的連接已經失效了。須要注意的是JDK的版本不同,連接也不同。VisualVM官網插件中心算法
-
配置好更新連接之後,在「可用插件」選項卡里就能看到有哪些插件能夠安裝,能夠根據須要安裝。好比Visual GC,JConsole插件等服務器
VisualVM使用
- 安裝好Visual GC插件之後,打開Visual GC插件選項卡就能夠看到Android Studio的虛擬機運行的詳細信息了,包括堆的大小,新生代、老年代的大小,類加載的時間,編譯的時間,GC的狀況等。
- 如上圖,「Graphs」中能夠看到各個階段的花費的時間,其中從上到下分別爲編譯時間、類加載的時間、GC花費的次數和時間。
- 咱們能夠反覆打開Android Studio,查看Android Studio打開過程當中的時間花費狀況,以便看看有哪些地方能夠優化
- 好比,上圖中咱們看到啓動過程當中一共發生了19次GC,若是咱們想看看GC的具體狀況,就須要讓虛擬機的打印GC日誌。
讓Android Studio的虛擬機打印GC日誌
- 首先,咱們要找到Android Studio中配置虛擬機的文件。這個文件在Android Studio的安裝目錄裏面。「應用程序」-->Android Studio-->右鍵顯示包內容-->contents-->bin
- 上圖中的studio.vmoptions就是虛擬機的配置文件,打開文件,加入讓虛擬機打印GC日誌的參數-XX:+PrintGCDetails,同時利用參數-Xloggc:./gclogs設置GC日誌的輸出位置。
簡單分析GC日誌
0.875: [GC (Allocation Failure) 0.876: [ParNew: 104960K->13056K(118016K), 0.0681057 secs] 104960K->36781K(249088K), 0.0682067 secs] [Times: user=0.12 sys=0.05, real=0.07 secs]微信
- ParNew表示的是發生GC的區域是新生代,這個名字和使用的GC收集器有關,由於這裏Android Studio的新生代收集器爲ParNew收集器,因此是區域名字是ParNew
- [ParNew: 104960K->13056K(118016K), 0.0681057 secs],104960K表示的是GC前該區域已經使用的容量,13056K爲GC後的容量,118016K爲總容量,後面的爲花費的時間
- 104960K->36781K(249088K),表示「GC前Java堆已使用的容量->GC後Java堆已使用的容量(Java堆總容量)」
以上是VisualVM的簡單使用和GC的分析,實際上VisualVM的功能很強大,能夠用於監控分析遠程服務器虛擬機的狀況,以便調優。
下面附加一些虛擬機的設置參數
- -Xms:堆的最小值,好比-Xms240M,就表示設置堆的最小值爲240M
- -Xmx:堆的最大值,好比-Xmx1024M,就表示設置堆的最大值爲1G
- -Xmn:堆內新生代的大小,好比-Xmn10M,就表示設置新生代大小爲10M
- -Xss:本地方法棧的容量,好比-Xss128K,就表示設置棧容量爲128K
- -XX:PermSize,方法區(HotSpot虛擬機中也叫永久代)的大小,好比-XX:PermSize=10M,就表示設置方法區的大小爲10M
- -XX:MaxPermSize,方法區的最大值,好比-XX:MaxPermSize=10M,就表示設置方法區最大值爲10M(Java 8之後移除了方法區,取而代之的是本地元空間Metaspace,大小由-XX:MetaspaceSize和-XX:MaxMetaspaceSize調節)
- -XX:MaxDirectMemorySize,指定本機直接內存大小,如-XX:MaxdirectMemorySize=10M,就表示設置本機直接內存爲10M,不設置的話默認會和Java堆的最大值同樣
- -XX:+/-UseTALB ---是否使用TALB(本地線程分配緩衝)
- -XX:+/-HeapDumpOnOutOfMemoryError ---讓虛擬機在出現內存溢出異常時是否Dump出當前的內存堆轉儲快照
- -Xverify:none ---禁止JDK進行類加載時的字節碼驗證過程
- XX:+PrintGCTimeStamps ---打印GC停頓時間
- XX:+PrintGCDetails ---打印GC詳細信息
- -verbose:gc ---打印GC信息
- -XX:+DisableExplicitGC ---屏蔽掉System.gc()
- -Xnoclassgc ---不對類進行回收,避免反覆加載卸載類
- -XX:+/-UseCompressedOops ---是否啓用壓縮普通對象指針,主要是64位虛擬機的對象指針長度更長,會比32位佔用更多內存,啓用壓縮普通對象指針後能夠減小內存佔用
垃圾收集器相關
- -XX:+UseConcMarkSweepGC ---使用CMS垃圾收集器
- -XX:+UseParNewGC ---使用ParNew垃圾收集器
- -XX:SurvivorRatio ---新生代Eden區與Survivor區的比例,好比-XX:SurvivorRatio=8,就表示Eden區與一個Survivor區的空間比例是8:1
- -XX:PretenureSizeThreshold ---晉升老年代對象大小,大於設置值的對象直接在老年代中分配,好比-XX:PretenureSizeThreshold=3145728,就表示大於3M的對象都會直接在老年代中分配,其中3145728不能寫成3M。這個參數設置只對Serial和ParNew收集器有效
- -XX:+/-HandlePromotionFailure --- 是否容許空間分配擔保失敗。Minor GC(新生代GC)時會檢查老年代最大可用內存是否大於新生代全部對象總空間,若是不知足,就檢查HandlePromotionFailure,若是不容許空間分配擔保失敗,就會觸發Full GC(老年代GC)
- -XX:MaxTenuringThreshold ---對象晉升老年代的年齡閾值,好比-XX:MaxTenuringThreshold=15,就是說當對象熬過15次Minor GC(也就是15歲啦),就將會被晉升到老年代中
- -XX:ParallelGCThreads ---限制垃圾收集的線程數,如XX:ParallelGCThreads=8,表示JVM在進行並行GC的時候,有8個線程用於GC
- -XX:MaxGCPauseMills ---Parallel Scavenge收集器用來控制最大垃圾收集停頓時間,容許大於0的毫秒數
- -XX:GCTimeRatio ---Parallel Scavenge收集器用來控制吞吐量大小,應當是一個大於0小於100的整數
- -XX:+/-UseAdaptiveSizePolicy ---Parallel Scavenge收集器用來開關自適應調節策略
- -XX:CMSInitiatingOccupancyFraction ---CMS收集器用來控制觸發垃圾收集的老年代空間使用比例。好比-XX:CMSInitiatingOccupancyFraction=85,就表示當老年代的空間已經使用了85%時就會出發垃圾收集。這個值過低的話會頻繁觸發收集,過高的話容易致使老年代空間不夠用戶程序使用產生「Concurrent Mode Failure」失敗,致使採用Serial Old收集器而性能降低
- -XX:+/-UseCMSCompactAtFullCollection ---CMS收集器用來開啓內存碎片整理的開關。因爲CMS收集器採用的是「標記-清除」算法,會產生不少內存碎片,從而須要進行內存整理。默認開啓。
- -XX:CMSFullGCsBeforeCompaction ---CMS收集器用於設置執行多少次不壓縮的Full GC後,跟着來一次帶壓縮的(整理內存碎片)。默認值爲0,即每次進入Full GC時都進行碎片整理。
歡迎關注個人微信公衆號,和我一塊兒學習一塊兒成長! 工具