從上面這個圖咱們整體上對JVM的結構特別是內存結構有了比較清晰的認識,雖然在JDK1.8+的版本中,JVM內存管理結構有了必定的優化調整。主要是方法區(持久代)取消變成了直接使用元數據區(直接內存)的方式,可是總體上JVM的結構並無大改,特別是咱們最爲關心的堆內存管理方式並無在JDK1.8+的版本中有什麼變化,因此圖中的結構總體上是沒有什麼不許確的,之因此將方法區以及持久代標註出來,主要仍是爲了起到對比認識的做用,你們知道就能夠了。程序員
關於持久代元數據區的使用問題,目前能夠理解就是使用的物理內存,理論上是不受JVM自動內存回收機制管理的,若是不設置參數大小默認最大使用限制就是操做系統可用物理內存的大小,設置了-XX:MetaspaceSize參數的話,JVM就會在使用物理內存空間時本身進行限制。算法
至於直接內存與物理內存究竟是不是一回事,我認爲對於咱們理解上沒有區別,只是概念的區別,另外就是對這塊內存使用細節上的區別,若是不受JVM的自動回收管理,那麼怎麼管理呢?說到底仍是JVM自己在直接使用物理內存或者說是直接內存(用時直接「malloc」物理內存區域,而再也不是JVM進程啓動時初始化的內存區域),還有一種概念叫native memory,說實話我暫時還不理解他們到底有啥區別,若是你們對這些概念有更好的認識,也能夠給我留言哦!之因此對這幾個問題作一些筆墨的說明,主要是在以前的文章中你們對此提出了疑問,因此正好在這節的內容中進行下闡述。編程
回到今天的主題,咱們知道JAVA最大的優勢就是能夠實現自動內存管理,這極大的便利了JAVA程序員,下降了使用成本。但這也使得平時咱們在使用JAVA編程時不太關注JVM究竟是怎樣進行內存回收的,只有在須要實際對JVM進行系統性能調優,這裏的場景多是在系統面臨極致性能優化要求時,咱們才發現須要對JAVA的總體內存結構以及內存回收機制要有必定的認識和了解才行。性能優化
從上面的圖中,咱們也大體對整個垃圾回收系統進行了標註,這裏主要涉及回收策略、回收算法、垃圾回收器這幾個部分。形象一點表述,就是JVM須要知道那些內存能夠被回收,要有一套識別機制,在知道那些內存能夠回收之後具體採用什麼樣的回收方式,這就須要設計一些回收算法,而具體的垃圾回收器就是根據不一樣內存區域的使用特色,採用相應地回收策略和算法的具體實現了。ide
在性能