一.JVM在新版本的改進更新以及相關知識html
1.JVM在新版本的改進更新java
圖中能夠看到運行時常量池是放在方法區的程序員
1.1對比:json
JDK 1.7 及以往的 JDK 版本中,Java 類信息、常量池、靜態變量都存儲在 Perm(永久代)裏。類的元數據和靜態變量在類加載的時候分配到 Perm,當類被卸載的時候垃圾收集器從 Perm 處理掉類的元數據和靜態變量。固然常量池的東西也會在 Perm 垃圾收集的時候進行處理。tomcat
JDK 1.8 的對 JVM 架構的改造將類元數據放到本地內存中,另外,將常量池和靜態變量放到 Java 堆裏。HotSopt VM 將會爲類的元數據明確分配和釋放本地內存。在這種架構下,類元信息就突破了原來 -XX:MaxPermSize 的限制,如今可使用更多的本地內存。這樣就從必定程度上解決了原來在運行時生成大量類的形成常常 Full GC 問題,如運行時使用反射、代理等。服務器
1.2注意:架構
若是服務器內存足夠,升級到 JDK 1.8 修改 JVM 參數最簡單的辦法就是將 -XX:PermSize 和 -XX:MaxPermSize 參數替換爲 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSizeapp
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,參考:http://blog.csdn.net/double_name/article/details/51193638
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
二.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.導出功能