一.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

2.GC機制中,JVM對記憶體的分區
【需要說明:中繼資料區的大小限定于本地記憶體的大小,Eden、Survivor、Old區都是JVM管理下的堆中配置設定的記憶體區域】
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 插件安裝
首次啟動可以安裝插件 工具-->插件
2.啟動VisualVM
啟動你的tomcat,跑起來一個項目之後,啟動VisualVM
輕按兩下左側Tomcat,右側概述
3.JVM調優參數修改
上圖中JVM參數,就是目前你本項目的JVM相關配置,同樣的,你可以在Myecplise中Servers下輕按兩下部署本項目的Tomcat,
open launch configuration【打開釋出配置】
4.監視标簽,可以檢視CPU/堆/Matespace/類/線程的大概情況
5.Profiler 标簽
在 Profiler 标簽,點選“記憶體”按鈕将啟動一個記憶體分析會話,等 VisualVM 收集和統計完相關性能資料資訊,将會顯示在性能分析結果。通過記憶體性能分析結果,我們可以檢視哪些對象占用了較多的記憶體,存活的時間比較長等,以便做進一步的優化。
此外,我們可以通過性能分析結果下方的類名過濾器對分析結果進行過濾。
6.Visual GC标簽
7.線程标簽
8.快照功能
9.導出功能