五大區域:算法
1)程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器,字節碼解析器的工做是經過改變這個計數器的值,來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能,都須要依賴這個計數器來完成;(私有)性能
2)Java 虛擬機棧(棧)(Java Virtual Machine Stacks):用於存儲局部變量表、操做數棧、動態連接、方法出口等信息;(私有)大數據
3)本地方法棧(Native Method Stack):與虛擬機棧的做用是同樣的,只不過虛擬機棧是服務 Java 方法的,而本地方法棧是爲虛擬機調用 Native 方法服務的;(私有)spa
4)Java堆((堆)Java Heap):Java虛擬機中內存最大的一塊,是被全部線程共享的,幾乎全部的對象實例都在這裏分配內存;(共享)線程
5)方法區(Methed Area):用於存儲已被虛擬機加載的類信息、常量、靜態變量】即時編譯後的代碼等數據。(共享)對象
JVM的內存結構包括五大區域:程序計數器、虛擬機棧、本地方法棧、堆區、方法區。其中程序計數器、虛擬機棧、本地方法棧3個區域隨線程而生、隨線程而滅,所以這幾個區域的內存分配和回收都具有肯定性,就不須要過多考慮回收的問題,由於方法結束或者線程結束時,內存天然就跟隨着回收了。而Java堆區和方法區則不同這部份內存的分配和回收是動態的,正是垃圾收集器所需關注的部分。blog
垃圾收集器在對堆區和方法區進行回收前,首先要肯定這些區域的對象哪些能夠被回收,哪些暫時還不能回收,這就要用到判斷對象是否存活的算法!內存
判斷對象死沒死,常見的有兩種方法:虛擬機
一、引用計數法:爲每一個對象建立一個引用計數,有對象引用時計數器 +1,引用被釋放時計數 -1,當計數器爲 0 時就能夠被回收。它有一個缺點不能解決循環引用的問題;io
二、可達性計數法:從 GC Roots 開始向下搜索,搜索所走過的路徑稱爲引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連時,則證實此對象是能夠被回收的。
問題:
JVM有哪些垃圾回收算法?
回答:
一、標記-清除算法:標記無用對象,而後進行清除回收。
缺點:效率不高,標記和清除循環兩遍,對分配的內存來講,每每是連續的比較好,由於這樣有利於分配大數據的對象。假若當前內存中都是小段的內存碎片,會知道須要分配大段內存時,沒有能夠放置的位置,而觸發內存回收。也就是空間不足而致使頻繁GC和性能降低。
二、標記-整理算法:標記無用對象,讓全部存活的對象都向一端移動,而後直接清除掉端邊界之外的內存。
缺點:向一端移動,有太多的小而雜的對象來講,每次移動和計算都是很複雜的過程。所以在使用場景上,就註定限制了標記整理算法的使用不太適合頻繁建立和回收對象的內存中。
三、複製算法:按照容量劃分兩個大小相等的內存區域,當一塊用完的時候,將活着的對象複製到另外一塊上,而後再把已使用的內存空間一次清理掉。
缺點:內存使用率不高,只有原來的一半。
四、分代算法:根據對象存活週期的不一樣將內存劃分爲幾塊,通常是新生代和老年代,新生代基本採用複製算法,老年代採用標記整理算法。
問題:
棧堆的區別?
回答:
功能方面:堆是用來存放對象的,棧是用來執行程序的。
共享性:堆是線程共享,棧是線程私有的。
空間大小:堆的大小遠遠大於棧。
問題:
什麼是雙親委派模型?
回答以前:
在介紹雙親委派模型以前先說下類加載器。對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立在 JVM 中的惟一性,每個類加載器,都有一個獨立的類名稱空間。類加載器就是根據指定全限定名稱將 class 文件加載到 JVM 內存,而後再轉化爲 class 對象。
類加載器分類:
啓動類加載器(Bootstrap ClassLoader),是虛擬機自身的一部分,用來加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數所指定的路徑中而且被虛擬機識別的類庫;
其餘類加載器:
擴展類加載器(Extension ClassLoader):負責加載\lib\ext目錄或Java. ext. dirs系統變量指定的路徑中的全部類庫;
應用程序類加載器(Application ClassLoader)。負責加載用戶類路徑(classpath)上的指定類庫,咱們能夠直接使用這個類加載器。通常狀況,若是咱們沒有自定義類加載器默認就是用這個加載器。
回答:
雙親委派模型:若是一個類加載器收到了類加載的請求,它首先不會本身去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,這樣全部的加載請求都會被傳送到頂層的啓動類加載器中,只有當父加載沒法完成加載請求(它的搜索範圍中沒找到所需的類)時,子加載器纔會嘗試去加載類。