Java虛擬機(jī)學(xué)習(xí)(1):體系結(jié)構(gòu) 內(nèi)存模型
JVM內(nèi)存區(qū)域模型
1.方法區(qū): 也稱“永久代”臭杰、“非堆”褪那,它用于存儲虛擬機(jī)加載的類信息、常量涂屁、靜態(tài)變量、是各個線程共享的內(nèi)存區(qū)域灰伟。
? ? ? ? ? ? ? ? ? 默認(rèn)最小值為16MB,最大值64MB,可以通過-XX:PermSize 和 -XX:MaxPermSize參數(shù)限制方法區(qū)的大小拆又。
? ? ? ? ? ? ? ? ?運行時常量池:是方法區(qū)的一部分,Class文件中除了有類的版本栏账,字段帖族,方法,接口等描述信息外挡爵,還有一項
? ? ? ? ? ? ? ? ?信息是常量池竖般,用于存放編譯器生成的各種符號引用。這部分內(nèi)容將在加載后放到方法區(qū)的運行時常量池中茶鹃。
2.虛擬機(jī)棧:描述的是Java方法執(zhí)行的內(nèi)存模型------ 每個方法被執(zhí)行的時候捻激,都會創(chuàng)建一個“棧幀”,用于存儲局部變量表
? ? ? ? ? ? ? ? ? ? (包括參數(shù))前计、操作棧胞谭、方法出口等信息。每個方法被調(diào)用到執(zhí)行完的過程男杈,就對應(yīng)著一個棧幀在虛擬機(jī)棧中從
? ? ? ? ? ? ? ? ? ? 入棧到出棧的過程丈屹。聲明周期與線程相同,是線程私有的伶棒。
? 局部變量表存放了編譯器可知的各種基本數(shù)據(jù)類型(boolean旺垒、byte、char肤无、short先蒋、int、float宛渐、long竞漾、double)
對象引用(引用指針, 并非對象本身)窥翩,其中64位長度的long和double類型的數(shù)據(jù)會占用2個局部變量的空間业岁,其
? ? ? ? ? ? ? ? ? ? 余數(shù)據(jù)類型只占1個。局部變量表所需要的內(nèi)存空間在編譯期間完成分配寇蚊,當(dāng)進(jìn)入一個方法時笔时,這個方法需要在棧幀
? ? ? ? ? ? ? ? ? ? 中分配多大的局部變量是完全確定的,在運行期間棧幀不會改變局部變量表的大小空間仗岸。
3.本地方法棧:與虛擬機(jī)椩使ⅲ基本類似借笙,區(qū)別在與虛擬機(jī)棧為虛擬機(jī)執(zhí)行的java方法服務(wù),而本地方法棧則是為Native方法服務(wù)较锡。
4.堆:也叫做Java堆提澎,GC堆是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊內(nèi)存區(qū)域,也是被各個線程共享的內(nèi)存區(qū)域念链,在JVM啟動時創(chuàng)建
? ? ? ? ? 該內(nèi)存區(qū)域存放了對象實例及數(shù)組(所有new的對象)盼忌。其大小通過-Xms(最小值)和-Xmx(最大值)參數(shù)設(shè)置,-Xms為JVM
? ? ? ? ? 啟動時申請的最小內(nèi)存掂墓,默認(rèn)為操作系統(tǒng)物理內(nèi)存的1/64但小于1G谦纱,-Xmx為JVM可申請的最大內(nèi)存,默認(rèn)為物理內(nèi)存的1/4單
小于1G,默認(rèn)當(dāng)空余堆內(nèi)存小于40%時君编,JVM會增大Heap到-Xmx指定的大下跨嘉,可以通過-XX:MinHeapFreeRation =來指定這個
比例;當(dāng)空余堆內(nèi)存大于70%時吃嘿,JVM會減少heap的大小到-Xms指定的大小祠乃,可通過XX:MAxHeapFreeRation= 來指定這個比例
對于運行系統(tǒng),為避免在運行時頻繁調(diào)整Heap的大小兑燥,通常-Xms和-Xmx的值設(shè)成一樣亮瓷。
由于現(xiàn)在收集器都是采用分代收集算法,堆被劃分為新生代和老年代降瞳。新生代主要存儲新創(chuàng)建的對象和未進(jìn)入老年代的對象嘱支。老年
? ? ? ? ? ?代存儲經(jīng)過多次新生代GC(Minor GC)任然存活的對象。
新生代:程序心漸漸的對象都是從新生代分配內(nèi)存的挣饥。新生代由Eden Space和兩塊相同大小的Survivor Space(通常又稱S0和S1
? ? ? ? ? ? ? ? ? ? ? ? ?或者From和To)構(gòu)成除师,可通過-Xmn參數(shù)來指定新生代的大小,也可以通過-XX:SurvivorRation來調(diào)整Eden Space
? ? ? ? ? ? ? ? ? ? ? ? 及SurvivorSpace的大小扔枫。
? ? ? ? ?老年代:用于存放經(jīng)過多次新生代GC任然存活的對象汛聚,例如緩存對象,新建的對象也有可能直接進(jìn)入老年代短荐,主要有兩種
? ? ? ? ? ? ? ? ? ? ?情況:①.大對象倚舀,可 通過啟動參數(shù)設(shè)置-XX:PretenureSizeThreshold=1024(單位為字節(jié),默認(rèn)為0)來代表超過
? ? ? ? ? ? ? ? ? ? ?多大時就不在新生代分配搓侄,而是直接在老年代分配瞄桨。②.大的數(shù)組對象,切數(shù)組中無引用外部對象讶踪。
5.程序計數(shù)器:是最小的一塊內(nèi)存區(qū)域泊交,他的作用是當(dāng)前線程執(zhí)行的字節(jié)碼的行號指示器乳讥,在虛擬機(jī)的模型里柱查,字節(jié)碼解釋器工作時
? ? ? ? ? ? ? ? ? ? ? ? 就是通過改變這個計數(shù)器的值來選去嚇一跳需要執(zhí)行的字節(jié)碼指令、分支云石、循環(huán)唉工、異常處理、先生回復(fù)等基礎(chǔ)功能都需要
? ? ? ? ? ? ? ? ? ? ? ? 依賴計數(shù)器完成汹忠。