JVM模型的介紹二,接著上一篇我們繼續(xù)來(lái)分享,棧之本地方法棧。
本地方法棧的作用和java虛擬機(jī)棧的作用是相類似的;區(qū)別在于java虛擬機(jī)棧是為java方法服務(wù)的,而本地方法棧是為native方法服務(wù)的;java虛擬機(jī)規(guī)范中對(duì)本地方法棧中的方法使用的語(yǔ)言、使用方式和數(shù)據(jù)結(jié)構(gòu)沒有強(qiáng)制規(guī)范
堆
堆是jvm內(nèi)存模型中內(nèi)存空間最大的一塊,java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)隨之創(chuàng)建,堆創(chuàng)建的唯一目的就是用來(lái)保存對(duì)象實(shí)例,幾乎所有new創(chuàng)建的對(duì)象實(shí)例都在這里分配內(nèi)存(隨著JIT 編譯器的發(fā)展與逃逸分析技術(shù)的逐漸成熟,棧上分配、標(biāo)量替換優(yōu)化技術(shù)將會(huì)導(dǎo)致一些微妙的變化發(fā)生,所有的對(duì)象都分配在堆上也漸漸變得不是那么“絕對(duì)”了)
堆的大小可以通過-Xms和-Xmn兩個(gè)參數(shù)來(lái)設(shè)置,-Xms為JVM啟動(dòng)時(shí)申請(qǐng)的最小內(nèi)存,默認(rèn)為操作系統(tǒng)物理內(nèi)存的1/64但小于1G,-Xmx為JVM可申請(qǐng)的最大內(nèi)存,默認(rèn)為物理內(nèi)存的1/4但小于1G,默認(rèn)當(dāng)空余堆內(nèi)存小于40%時(shí),JVM會(huì)增大Heap到-Xmx指定的大小,可通過-XX:MinHeapFreeRation=來(lái)指定這個(gè)比列;當(dāng)空余堆內(nèi)存大于70%時(shí),JVM會(huì)減小heap的大小到-Xms指定的大小,可通過XX:MaxHeapFreeRation=來(lái)指定這個(gè)比列,對(duì)于運(yùn)行系統(tǒng),為避免在運(yùn)行時(shí)頻繁調(diào)整Heap的大小,通常-Xms與-Xmx的值設(shè)成一樣。
堆也是垃圾收集管理的主要區(qū)域,通常所說的垃圾回收主要是回收堆中的垃圾對(duì)象,因此堆也被稱為GC堆
從垃圾回收的角度上來(lái)看,由于現(xiàn)在垃圾收集大多是采用分代收集算法,所以java堆還可以細(xì)分為:新生代和老年代;
新生代:程序新創(chuàng)建的對(duì)象都是從新生代分配內(nèi)存,新生代由Eden Space和兩塊相同大小的Survivor Space(通常又稱S0和S1或From和To)構(gòu)成,可通過-Xmn參數(shù)來(lái)指定新生代的大小,也可以通過-XX:SurvivorRation來(lái)調(diào)整Eden Space及SurvivorSpace的大小。
老年代:用于存放經(jīng)過多次新生代GC仍然存活的對(duì)象(默認(rèn)是15次),例如緩存對(duì)象,新建的對(duì)象也有可能直接進(jìn)入老年代,主要有兩種情況:
1.大對(duì)象,可通過啟動(dòng)參數(shù)設(shè)置-XX:PretenureSizeThreshold=1024(單位為字節(jié),默認(rèn)為0)來(lái)代表超過多大時(shí)就不在新生代分配,而是直接在老年代分配。
2.大的數(shù)組對(duì)象,且數(shù)組中無(wú)引用外部對(duì)象。老年代所占的內(nèi)存大小為-Xmx對(duì)應(yīng)的值減去-Xmn對(duì)應(yīng)的值。
java堆也會(huì)出現(xiàn)內(nèi)存溢出的情況:如果在堆中沒有內(nèi)存完成實(shí)例分配,并且堆也無(wú)法再擴(kuò)展時(shí),將會(huì)拋出OutOfMemoryError 異常
方法區(qū)
方法區(qū)用于存放已被虛擬機(jī)加載的類信息、常量、類變量等數(shù)據(jù),它也是所有線程共享的一塊內(nèi)存區(qū)域,通常叫它為no-heap(用于與堆區(qū)分)或者永生代
永生代也會(huì)被GC回收,主要針對(duì)常量池回收和類型卸載(反射生成大量的臨時(shí)class等信息)
常量池用于保存編譯器生成的各種字節(jié)碼和符號(hào)引用,具有一定的動(dòng)態(tài)性,里面可以保存編譯器生成的常量,運(yùn)行期間的常量也是可以添加到常量池中的,比如String的intern()方法;
方法區(qū)也是會(huì)出現(xiàn)內(nèi)存溢出的情況的:當(dāng)方法區(qū)滿時(shí),無(wú)法再分配內(nèi)存空間,就會(huì)拋出內(nèi)存溢出的異常
在java8中已經(jīng)沒有方法區(qū)了,取而代之的是元空間metaspace
以上就是小編介紹的"Java培訓(xùn)班分享的內(nèi)容,希望對(duì)大家有幫助,如有疑問還可以點(diǎn)擊進(jìn)入Java視頻教程進(jìn)行學(xué)習(xí)。