JVM堆的簡介
JVM堆的簡介
一、基本概念
Java 中的堆是 JVM 管理的最大的一塊內存空間,主要用于存放Java類的實例對象,其被劃分為兩個不同的區域:新生代 ( Young )和老年代 ( Old ),其中新生代 ( Young )又被劃分為:Eden、From Survivor和To Survivor三個區域,如下圖所示:
從JDK8開始,Metaspace(元空間)替代了永久代,如下圖所示:
二:堆的各個區域
無論哪個版本的JDK,其堆內存的劃分都沒有變化,下面詳述Java堆中各個區域:
1、堆大小 = 新生代( Young ) + 老年代( Old ),其可以通過參數 –Xms、-Xmx 來指定:–Xms用于設置初始分配大小,默認為物理內存的1/16;-Xmx用于設置最大分配內存,默認為物理內存的1/4。默認情況下,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數 –XX:NewRatio 來指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小,老年代 ( Old ) = 2/3 的堆空間大小,如下代碼:
public class Test {
//-Xms1024m -Xmx1024m -XX:+PrintGCDetails
public static void main(String[] args) {
System.out.println("Hello,JVM!");
}
}
JDK8運行結果:
Hello,JVM!
Heap
def new generation total 314560K, used 11185K [0x04800000, 0x19d50000, 0x19d50000)
eden space 279616K, 4% used [0x04800000, 0x052ec418, 0x15910000)
from space 34944K, 0% used [0x15910000, 0x15910000, 0x17b30000)
to space 34944K, 0% used [0x17b30000, 0x17b30000, 0x19d50000)
tenured generation total 699072K, used 0K [0x19d50000, 0x44800000, 0x44800000)
the space 699072K, 0% used [0x19d50000, 0x19d50000, 0x19d50200, 0x44800000)
Metaspace used 1772K, capacity 2242K, committed 2368K, reserved 4480K
2、新生代 ( Young ) 被細分為 Eden 和 兩個 Survivor 區域,為了便于區分,兩個 Survivor 區域分別被命名為 from 和 to。默認情況下,Eden : from : to = 8 : 1 : 1 ( 可以通過參數 –XX:SurvivorRatio 來設定 ),即: Eden = 8/10 的新生代空間大小,from = to = 1/10 的新生代空間大小。JVM 每次只使用 Eden 和其中的一塊 Survivor 區域來為對象服務,所以無論什么時候,總是有一塊 Survivor 區域是空閑著的,因此,新生代實際可用的內存空間為 9/10 ( 即90% )的新生代空間。
3、工作原理:
a、Eden區為Java對象分配堆內存,當 Eden 區沒有足夠空間分配時,JVM發起一次Minor GC,將Eden區仍然存活的對象放入Survivor from區,并清空 Eden 區;
b、Eden區被清空后,繼續為新的Java對象分配堆內存;
c、當Eden區再次沒有足夠空間分配時,JVM對Eden區和Survivor from區同時發起一次 Minor GC,把存活對象放入Survivor to區,同時清空Eden 區和Survivor from區;
d、Eden區繼續為新的Java對象分配堆內存,并重復上述過程:Eden區沒有足夠空間分配時,把Eden區和某個Survivor區的存活對象放到另一個Survivor區;
e、JVM給每個對象設置了一個對象年齡(Age)計數器,每熬過一場Minor GC,對象年齡增加1歲,當它的年齡增加到閾值(默認為15,可以通過-XX:MaxTenuringThreshold 參數自定義該閥值),將被“晉升”到老年代,當 Old 區也被填滿時,JVM發起一次 Major GC,對 Old 區進行垃圾回收。
智能推薦
JVM -- 簡介
Java虛擬機的發展 Sun Classic VM Exact VM HotSpot VM KVM (Kilobyte) JRockit J9 Azul VM Liquid VM Dalvik VM Microsoft JVM Sun Classic VM Exact VM HotSpot VM KVM (Kilobyte) JRockit J9’ Dalvik Azul VM Liq...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
猜你喜歡
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...