1.方法區
也稱"永久代」 、「非堆」, 它用於存儲虛擬機加載的類信息、常量、靜態變量、是各個線程共享的內存區域。默認最小值爲16MB,最大值爲64MB,能夠經過-XX:PermSize 和 -XX:MaxPermSize 參數限制方法區的大小。 java
運行時常量池:是方法區的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用於存放編譯器生成的各類符號引用,這部份內容將在類加載後放到方法區的運行時常量池中。 算法
2.虛擬機棧
描述的是java 方法執行的內存模型:每一個方法被執行的時候 都會建立一個「棧幀」用於存儲局部變量表(包括參數)、操做棧、方法出口等信息。每一個方法被調用到執行完的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。聲明週期與線程相同,是線程私有的。 數組
局部變量表存放了編譯器可知的各類基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(引用指針,並不是對象自己),其中64位長度的long和double類型的數據會佔用2個局部變量的空間,其他數據類型只佔1個。局部變量表所需的內存空間在編譯期間完成分配,當進入一個方法時,這個方法須要在棧幀中分配多大的局部變量是徹底肯定的,在運行期間棧幀不會改變局部變量表的大小空間。 緩存
3.本地方法棧
與虛擬機棧基本相似,區別在於虛擬機棧爲虛擬機執行的java方法服務,而本地方法棧則是爲Native方法服務。 spa
4.堆
也叫作java 堆、GC堆是java虛擬機所管理的內存中最大的一塊內存區域,也是被各個線程共享的內存區域,在JVM啓動時建立。該內存區域存放了對象實例及數組(全部new的對象)。其大小經過-Xms(最小值)和-Xmx(最大值)參數設置,-Xms爲JVM啓動時申請的最小內存,默認爲操做系統物理內存的1/64但小於1G,-Xmx爲JVM可申請的最大內存,默認爲物理內存的1/4但小於1G,默認當空餘堆內存小於40%時,JVM會增大Heap到-Xmx指定的大小,可經過-XX:MinHeapFreeRation=來指定這個比列;當空餘堆內存大於70%時,JVM會減少heap的大小到-Xms指定的大小,可經過XX:MaxHeapFreeRation=來指定這個比列,對於運行系統,爲避免在運行時頻繁調整Heap的大小,一般-Xms與-Xmx的值設成同樣。 操作系統
因爲如今收集器都是採用分代收集算法,堆被劃分爲新生代和老年代。新生代主要存儲新建立的對象和還沒有進入老年代的對象。老年代存儲通過屢次新生代GC(Minor GC)任然存活的對象。 線程
新生代:
程序新建立的對象都是重新生代分配內存,新生代由Eden Space和兩塊相同大小的Survivor Space(一般又稱S0和S1或From和To)構成,可經過-Xmn參數來指定新生代的大小,也能夠經過-XX:SurvivorRation來調整Eden Space及Survivor Space的大小。 指針
老年代:
用於存放通過屢次新生代GC任然存活的對象,例如緩存對象,新建的對象也有可能直接進入老年代,主要有兩種狀況:①.大對象,可經過啓動參數設置-XX:PretenureSizeThreshold=1024(單位爲字節,默認爲0)來表明超過多大時就不在新生代分配,而是直接在老年代分配。②.大的數組對象,切數組中無引用外部對象。 對象
老年代所佔的內存大小爲-Xmx對應的值減去-Xmn對應的值。 接口
5.程序計數器
是最小的一塊內存區域,它的做用是當前線程所執行的字節碼的行號指示器,在虛擬機的模型裏,字節碼解釋器工做時就是經過改變這個計數器的值來選取下一條須要執行的字節碼指令,分支、循環、異常處理、線程恢復等基礎功能都須要依賴計數器完成。
直接內存並非虛擬機內存的一部分,也不是Java虛擬機規範中定義的內存區域。jdk1.4中新加入的NIO,引入了通道與緩衝區的IO方式,它能夠調用Native方法直接分配堆外內存,這個堆外內存就是本機內存,不會影響到堆內存的大小。