第二部分_第二章 自動內存管理機制(java內存區域與內存溢出異常)

運行時數據區域

直接內存

頻繁被使用java

jdk1.4加入NIO(New Input/Output),一種基於通道與緩衝區的I/O方式,併發

能夠使用Native函數庫直接分配堆外內存,經過java堆中的DirectByteBuffer對象做爲這塊內存的引用進行操做。這樣避免了在Java堆和Native堆中來回複製數據,提升性能。函數

注意:此部分的內存不受java堆大小的限制,收本機總內存的限制,配置虛擬機內存時,不可以忽略此處的內存,不然會致使動態擴展時出現OutOfMemoryError異常。高併發

HotSpot

對象的建立:

new指令 --》檢查指令參數可否在常量池中定位一個類的符號引用,這個符號表明的類是否已被加載、解析和初始化過。----》若是沒有,必須先執行相應的類加載過程 -----》爲新生對象分配內存佈局

分配內存方式:指針碰撞(堆內存絕對規整)性能

                         空閒列表(堆內存不是規整的)spa

   是否規整由採用的垃圾收集器是否帶有壓縮整理功能決定。線程

對象的頻繁建立(高併發)解決方案:指針

           方案一:同步處理,採用CAS配上失敗重試,保證跟新操做的原子性;對象

           方案二:內存分配的動做按照線程劃分在不一樣的空間之中進行。(本地線程分配緩衝 Thread Local Allocation Buffer ,TLAB)

---》虛擬機對對象進行必要的設置(該對象是哪一個類的實例,對象的哈希碼值)

----》一個對象產生了(從虛擬機視角)

對象建立剛剛開始(從java程序的視角) ------<init>方法尚未執行。

對象的內存佈局:

相關文章
相關標籤/搜索