內存模型&分區
- Java虛擬機在運行Java程序時,會管理着一塊內存區域:運行時數據區
- 在運行時數據區裏,會根據用途進行劃分:
- Java虛擬機棧(棧區)
- 本地方法棧
- Java堆(堆區)
- 方法區
- 程序計數器
1.Java堆內存
-
Java堆內存的定義:堆內存(Heap),是垃圾回收機制管理的主要區域,能夠稱爲:GC堆java
-
Java堆內存的做用:主要就是存放Java對象的實例函數
-
Java堆內存的特色:JVM內存中最大而且線程共享性能
-
Java堆內存出現的異常:OutOfMemoryError異常,堆內存中沒有足夠的內存完成對象實例的分配而且堆沒法再繼續擴展。學習
-
Java堆內存備註說明:線程
- 從內存回收的角度分爲:新生代和老年代,若是深刻在進行查詢學習
- 從內存分配的角度至關於:多個線程私有的分配緩衝區
2.Java虛擬機棧
- Java虛擬機棧:棧內存(Stack),是Java方法執行的內存模型
- 棧內存的做用:存儲Java方法執行時的局部變量
- 以幀棧的形式
- 含數據類型和對象的引用(地址)
- 方法執行結束後就釋放
- 棧內存的特色:線程是私有的,生命週期與線程相同
- 棧內存常見的異常:
- OutOfMemoryError異常:虛擬機棧擴展時沒法申請到內存空間
- StackOverflowError異常:線程請求棧深度 > 虛擬機所容許的深度
- 棧內存備註:
- 每一個Java方法執行時都會建立一個棧幀
- 一個Java方法從被調用到執行完成 等價於 一個棧幀在虛擬機棧中的入棧到出棧
- 局部變量所須要內存空間在方法編譯時就會完成分配,在方法運行時不會改變大小
3.本地方法棧
相似於Java虛擬機棧,與Java虛擬機棧區別在於:服務的對象3d
- Java虛擬機棧爲執行Java方法服務;
- 本地方法棧爲執行Native方法服務;(百度一下:Native方法是什麼方法)
4.方法區
- 方法區是堆的一個邏輯部分,爲了與Java堆區分,能夠稱爲:「非堆」區域(None - Heap)
- 方法區的做用:存儲已被虛擬機加載的 類信息、常量、靜態變量等數據
- 方法區的特色:線程是共享的
- 方法區常見的異常:OutOfMemoryError異常,當方法區沒法知足內存分配需求
- 方法區的備註:
- 該區域的內存回收主要是針對於運行時常量池和對類的卸載
- 又稱「永久代」:回收條件苛刻,不多出現垃圾收集
運行時常量池單獨說明
- 常量池是方法區的一部分
- 常量池的做用是:存放類文件的編譯時生成的各類字面量&符號引用
- 常量池的特色是:動態性,運行時能夠添加新的常量,例如:
java.lang.String類中的intern()方法
- 常量池常見的異常:OutOfMemoryError異常,當常量池沒法申請到內存時
5.程序計數器
- 程序計數器是指當前線程所執行的字節碼的行號指示器
- 程序計數器做用是實現異常處理、線程恢復等基礎功能
- 程序計數器原理是經過改變計數器的值,來選取下一條執行的字節碼指令
- 程序計數器的特色:A.線程是私有的 B.內存空間比較小
- 程序計數器常見的異常:惟一一個在JVM中無任何OutOfMemoryError的內存區域
- 程序計數器備註:
- 線程私有的內存區域
- 爲了使用線程切換後恢復到正確的位置
- 每條線程都配有獨立的程序計數器,各個線程互不影響
- 獨立存儲的內存區域
6.額外備註:直接內存
- 定義:NIO類(JDK1.4引入)中基於通道和緩衝區的I/O方式,經過使用Native函數庫直接分配的堆外內存
- 特色:不受堆大小限制
- 應用場景:適用於頻繁調用的場景
經過一個 存儲在Java堆中的DirectByteBuffer對象 做爲這塊內存的引用 進行操做,從而避免在Java 堆和 Native堆之間來回複製數據,提升使用性能code
這段須要有一些知識儲備纔好!cdn
- 拋出的異常:OutOfMemoryError,即與其餘內存區域的總和 大於 物理內存限制