天天看點

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

一.JVM在新版本的改進更新以及相關知識

1.JVM在新版本的改進更新

圖中可以看到運作時常量池是放在方法區的

  1.1對比:

    JDK 1.7 及以往的 JDK 版本中,Java 類資訊、常量池、靜态變量都存儲在 Perm(永久代)裡。類的中繼資料和靜态變量在類加載的時候配置設定到 Perm,當類被解除安裝的時候垃圾收集器從 Perm 處理掉類的中繼資料和靜态變量。當然常量池的東西也會在 Perm 垃圾收集的時候進行處理。

    JDK 1.8 的對 JVM 架構的改造将類中繼資料放到本地記憶體中,另外,将常量池和靜态變量放到 Java 堆裡。HotSopt VM 将會為類的中繼資料明确配置設定和釋放本地記憶體。在這種架構下,類元資訊就突破了原來 -XX:MaxPermSize 的限制,現在可以使用更多的本地記憶體。這樣就從一定程度上解決了原來在運作時生成大量類的造成經常 Full GC 問題,如運作時使用反射、代理等。

  1.2注意:

    如果伺服器記憶體足夠,更新到 JDK 1.8 修改 JVM 參數最簡單的辦法就是将 -XX:PermSize 和 -XX:MaxPermSize 參數替換為 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize

    1.8中-XX:PermSize 和 -XX:MaxPermSize 已經失效,取而代之的是一個新的區域 —— Metaspace(中繼資料區)。

    使用JDK1.8以及之後的版本,不會再碰上“java.lang.OutOfMemoryError: PermGen space”這個錯誤了。

  1.3優勢了解:

    permSize:原來的jar包及你自己項目的class存放的記憶體空間,這部分空間是固定的,啟動參數裡面-permSize确定,如果你的jar包很多,經常會遇到permSize溢出,且每個項目都會占用自己的permGen空間

    改成metaSpaces,各個項目會共享同樣的class記憶體空間,比如兩個項目都用了fast-json開源包,在mentaSpaces裡面隻存一份class,提高記憶體使用率,且更利于垃圾回收

   1.4差別

    元空間并不在虛拟機中,而是使用本地記憶體。是以,預設情況下,元空間的大小僅受本地記憶體限制

   1.5參數來指定元空間的大小   

    -XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行類型解除安裝,同時GC會對該值進行調整:如果釋放了大量的空間,就适當降低該值;如果釋放了很少的空間,那麼在不超過MaxMetaspaceSize時,适當提高該值。

    -XX:MaxMetaspaceSize,最大空間,預設是沒有限制的。

    除了上面兩個指定大小的選項以外,還有兩個與 GC 相關的屬性:

    -XX:MinMetaspaceFreeRatio,在GC之後,最小的Metaspace剩餘空間容量的百分比,減少為配置設定空間所導緻的垃圾收集

    -XX:MaxMetaspaceFreeRatio,在GC之後,最大的Metaspace剩餘空間容量的百分比,減少為釋放空間所導緻的垃圾收集

    關于matespace

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用
【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

2.GC機制中,JVM對記憶體的分區

【需要說明:中繼資料區的大小限定于本地記憶體的大小,Eden、Survivor、Old區都是JVM管理下的堆中配置設定的記憶體區域】

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

  2.1 GC是什麼

    GC(GarbageCollection)是垃圾回收機制,在java中開發人員無法使用指針來自由的管理記憶體,GC是JVM對記憶體(實際上就是對象)進行管理的方式。GC使得Java開發人員擺脫了繁瑣的記憶體管理工作,讓程式的開發更有效率。

  2.2 GC的工作原理

    自己的話:對于程式員來說,配置設定對象使用new關鍵字;釋放對象時,隻要将對象所有引用指派為null,讓程式不能夠再通路到這個對象,我們稱該對象為"不可達的"或者"不被引用"。GC将負責回收所有"不可達"對象的記憶體空間。

    上圖中

      1》新new的對象都放在Eden區

      2》Eden區滿或者快滿的時候進行一次清理,不被引用的對象直接被幹掉;還有引用的對象,但是年齡比較大的,挪到S0區

      3》下次Eden區快滿的時候,會進行上一步的操作,并且将Eden和S0區的年紀大的對象放到S1區【原理上随時保持S0和S1有一個是空的,用來存下一次的對象】

      4》下下次,Eden區快滿的時候,會進行上一步操作,并且将Eden和S1區的年紀大的對象放到S0區【此時S1區就是空的】

      5》直到Eden區快滿,S0或者S1也快滿的時候,這時候就把這兩個區的年紀大的對象放到Old區

      6》依次循環,直到Old區也快滿的時候,Eden區也快滿的時候,會對整個這一塊記憶體區域進行一次大清洗,騰出記憶體,為之後的對象建立,程式運作騰地方。

  2.3 Minor GC、Major GC和Full GC

    清理Eden區和 Survivor區叫Minor GC。

    清理Old區叫Major GC。

    清理整個堆空間—包括年輕代和老年代叫Full GC。

    參考:http://www.importnew.com/15820.html

3.元空間詳解

 javascript:void(0)

 

 二.VisualVM的安裝使用

VisualVM 是一款免費的性能分析工具,JDK自帶的,在JDK安裝目錄bin下啟動【jvisualvm.exe】即可。

文檔位址:http://visualvm.java.net/applications_window.html

1.VisualVM 插件安裝

首次啟動可以安裝插件   工具-->插件

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

 2.啟動VisualVM

 啟動你的tomcat,跑起來一個項目之後,啟動VisualVM

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

輕按兩下左側Tomcat,右側概述

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

3.JVM調優參數修改

 上圖中JVM參數,就是目前你本項目的JVM相關配置,同樣的,你可以在Myecplise中Servers下輕按兩下部署本項目的Tomcat,

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

open launch configuration【打開釋出配置】

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用
【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

4.監視标簽,可以檢視CPU/堆/Matespace/類/線程的大概情況

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

5.Profiler 标簽

在 Profiler 标簽,點選“記憶體”按鈕将啟動一個記憶體分析會話,等 VisualVM 收集和統計完相關性能資料資訊,将會顯示在性能分析結果。通過記憶體性能分析結果,我們可以檢視哪些對象占用了較多的記憶體,存活的時間比較長等,以便做進一步的優化。

此外,我們可以通過性能分析結果下方的類名過濾器對分析結果進行過濾。

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用
【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用
【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

 6.Visual GC标簽

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

7.線程标簽

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

8.快照功能

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用

9.導出功能

【JVM】調優筆記2-----JVM在JDK1.8以後的新特性和元空間詳解以及VisualVM的安裝使用