1.JVM的內(nèi)存在物理內(nèi)存中并不一定是連續(xù)的,在邏輯上是連續(xù)的
2.JVM內(nèi)存可以分為堆和非堆內(nèi)存,線程私有和共享。

JVM內(nèi)存模型包括
線程私有
1.程序計數(shù)器
最小的一塊內(nèi)存模型,記錄下一條需要執(zhí)行的字節(jié)碼指令
2.虛擬機棧
Java方法執(zhí)行的內(nèi)存區(qū)域,每個方法執(zhí)行時都會產(chǎn)生一個棧幀,存儲局部變量表,操作棧(臨時數(shù)據(jù)存儲區(qū)域),方法出口,實例方法第一個引用是this
3.本地方法棧
與虛擬機棧類似,是為Native方法服務
共享
1.堆
GC管理的主要區(qū)域,絕大部分創(chuàng)建的對象實例和數(shù)據(jù)都在堆上,分為新生代,老生代
新生代:Eden Space + S0(From Space) + S1(To Space)
老生代: Tenured Generation,存儲垃圾回收多次后仍存活的對象
2.方法區(qū)
也稱”永久代” 、“非堆”, 它用于存儲虛擬機加載的類信息、常量、靜態(tài)變量、JIT即時編譯后的代碼,是各個線程共享的內(nèi)存區(qū)域
運行時常量池:是方法區(qū)的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯器生成的各種符號引用,這部分內(nèi)容將在類加載后放到方法區(qū)的運行時常量池中。
堆和棧的區(qū)別:
1.存儲對象不同,棧存儲的是局部變量和方法調(diào)用
堆存儲的是對象和數(shù)組
2.棧是線程私有,堆是線程共享
3.棧的空間遠小于堆
4.??臻g不足:java.lang.StackOverFlowError。
堆空間不足:java.lang.OutOfMemoryError。
內(nèi)存溢出(Out of Memory)和內(nèi)存泄漏(Memory Leak)的區(qū)別
內(nèi)存溢出是指在申請內(nèi)存空間時沒有足夠的空間
內(nèi)存泄露則是在存在垃圾回收器無法自動回收的對象,導致空間不足
直接內(nèi)存
不屬于JVM,分配本機內(nèi)存