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