1.JVM的內(nèi)存在物理內(nèi)存中并不一定是連續(xù)的,在邏輯上是連續(xù)的
2.JVM內(nèi)存可以分為堆和非堆內(nèi)存汹桦,線程私有和共享。
JVM內(nèi)存模型包括
線程私有
1.程序計(jì)數(shù)器
最小的一塊內(nèi)存模型剩胁,記錄下一條需要執(zhí)行的字節(jié)碼指令
2.虛擬機(jī)棧
Java方法執(zhí)行的內(nèi)存區(qū)域保屯,每個(gè)方法執(zhí)行時(shí)都會(huì)產(chǎn)生一個(gè)棧幀单旁,存儲(chǔ)局部變量表已球,操作棧(臨時(shí)數(shù)據(jù)存儲(chǔ)區(qū)域)宽菜,方法出口,實(shí)例方法第一個(gè)引用是this
3.本地方法棧
與虛擬機(jī)棧類似神凑,是為Native方法服務(wù)
共享
1.堆
GC管理的主要區(qū)域吧趣,絕大部分創(chuàng)建的對(duì)象實(shí)例和數(shù)據(jù)都在堆上,分為新生代耙厚,老生代
新生代:Eden Space + S0(From Space) + S1(To Space)
老生代: Tenured Generation强挫,存儲(chǔ)垃圾回收多次后仍存活的對(duì)象
2.方法區(qū)
也稱”永久代” 、“非堆”薛躬, 它用于存儲(chǔ)虛擬機(jī)加載的類信息俯渤、常量、靜態(tài)變量型宝、JIT即時(shí)編譯后的代碼,是各個(gè)線程共享的內(nèi)存區(qū)域
運(yùn)行時(shí)常量池:是方法區(qū)的一部分八匠,Class文件中除了有類的版本、字段趴酣、方法梨树、接口等描述信息外,還有一項(xiàng)信息是常量池岖寞,用于存放編譯器生成的各種符號(hào)引用抡四,這部分內(nèi)容將在類加載后放到方法區(qū)的運(yùn)行時(shí)常量池中。
堆和棧的區(qū)別:
1.存儲(chǔ)對(duì)象不同,棧存儲(chǔ)的是局部變量和方法調(diào)用
堆存儲(chǔ)的是對(duì)象和數(shù)組
2.棧是線程私有指巡,堆是線程共享
3.棧的空間遠(yuǎn)小于堆
4.検缏模空間不足:java.lang.StackOverFlowError。
堆空間不足:java.lang.OutOfMemoryError藻雪。
內(nèi)存溢出(Out of Memory)和內(nèi)存泄漏(Memory Leak)的區(qū)別
內(nèi)存溢出是指在申請(qǐng)內(nèi)存空間時(shí)沒有足夠的空間
內(nèi)存泄露則是在存在垃圾回收器無法自動(dòng)回收的對(duì)象秘噪,導(dǎo)致空間不足
直接內(nèi)存
不屬于JVM,分配本機(jī)內(nèi)存