JVM運行時數(shù)據(jù)區(qū)內(nèi)存分布:
1 程序計數(shù)器:
很小的內(nèi)存,記錄當前線程所執(zhí)行的字節(jié)碼的行號指示器,字節(jié)碼的解釋器根據(jù)計數(shù)器的數(shù)值來確定下一條執(zhí)行的字節(jié)碼指令,邏輯處理、跳轉(zhuǎn)、異常等都需要其協(xié)作完成。該區(qū)域線程隔離,各個線程之間的計數(shù)器互不影響,獨立存儲,這個區(qū)域也被稱為“線程私有域”。
參考鏈接: https://blog.csdn.net/hhb200766/article/details/46912325
2 java虛擬機棧:java方法執(zhí)行的內(nèi)存模型
每個方法執(zhí)行的時候會創(chuàng)建一個棧幀,存儲局部變量表、操作數(shù)棧、動態(tài)鏈接,方法接口等信息,每個方法從調(diào)用到結(jié)束就對應著一個棧幀從入棧到出棧的過程。
局部變量表: 存放了編譯期可知的各種類型,對象引用,返回地址值
3 本地方法棧
與虛擬機棧發(fā)揮的作用非常相似,區(qū)別是一個為虛擬機執(zhí)行的java提供服務,一個位本地方法native服務。
Sun HotSport 虛擬機將二者合并為一個棧。
4 java 堆:java虛擬機管理的內(nèi)存中最大的一塊區(qū)域,gc的主要區(qū)域
JIT編譯器
逃逸分析
棧分配和標量替換
5 方法區(qū) 各個線程共享的區(qū)域
用于存儲已經(jīng)被虛擬機加載的類信息,常量,靜態(tài)變量,即時編譯器后的代碼數(shù)據(jù)。
虛擬機把方法區(qū)描述為堆中的一個邏輯部分;
6 運行時常量池
屬于方法區(qū)的一部分,必然受方法區(qū)內(nèi)存的限制,超出則拋出OutOfMemoryError異常。
直接內(nèi)存:
NIO:基于通道和緩沖區(qū)的I/O方式,可以使用native函數(shù)直接分配堆外內(nèi)存,顯著提升了性能,不受jvm內(nèi)存限制,但受到本機總內(nèi)存的限制,超出同樣會拋出OutOfMemoryError異常。