當前位置:
首頁 > 知識 > JVM學習筆記一:內存管理

JVM學習筆記一:內存管理

參考資料

本文參考:《深入理解Java虛擬機》作者 周志明 知識產權歸作者所有

走近java
  1. java組成部分:java語言、各平台虛擬機、Class文件結構、java api 類庫、第三方類庫
  2. Jre包括jvm和api
  3. java 未來展望:模塊化、混合語言、多核並行、豐富語法、64位虛擬機

自動內存管理機制

JVM學習筆記一:內存管理

PC程序計數器

PC:程序計數器,用於記錄和控制下一條需要執行的位元組碼的位置,分支、循環、跳轉、異常處理、線程恢復都需要依賴PC完成。 PC 是每個線程私有的,如果執行的是java方法,該值是位元組碼指令的地址,如果是native方法,該值是Undefined

Java虛擬機棧

JVM Stack 線程私有,用於存放棧幀 Frame 包括局部變數表、操作數棧、動態鏈接、方法出口等信息,如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常,如果Stack可以動態擴展,擴展到無法申請到足夠的內存時,拋出OutOfMemory"Error異常。-Xss 設置棧容量

Java堆

Heap 堆是線程共享 用於分配對象實例 -Xms10m 初始大小 -Xmx20m 最大大小 也包括線程私有的分配緩衝區 TLAB 方法區 Method Area 線程共享 用於存儲被JVM載入的類信息、常量、靜態變數、JIT後的代碼,又叫做非堆 Non-Heap,永久代,-XX:PermSize=64M JVM初始分配的非堆內存,-XX:MetaspaceSize,class metadata的初始空間配額,以bytes為單位,jdk1.7,符號引用(Symbols)轉移到了native heap;字面量(interned strings)轉移到了java heap;類的靜態變數(class statics)轉移到了java heap;在JDK8中,classe metadata(the virtual machines internal presentation of Java class),被存儲在叫做Metaspace的native memory。

運行時常量池

常量池是方法區的一部分,由Class文件解析後完成。

DirectMemory 或 Native Memory

JDK1.4引入的NIO可以使用Native函數直接分配堆外內存,然後通過DirectByteBuffer對象對這塊內存直接操作,避免了在Heap和NativeHeap直接來回複製數據,在設置-Xmx參數時要注意留出NativeMemory空間。

JDK1.6的intern方法把首次出現的字元串實例複製到永久代中,並返回已複製的實例引用

JDK1.7的intern方法不會再複製實例、而只是在常量池中記錄首次出現的實例引用,因此intern返回的引用和調用者是同一個引用。

創建對象分配內存方式:
  1. 指針碰撞,移動已使用內存和空閑內存之間的指針,前提是已使用和空閑內存比較規整。
  2. 空閑列表,記錄可用內存塊及大小。
  3. 內存分配的同步問題:使用CAS + 失敗重試 保證內存分配的原子性,或利用TLAB,現在TLAB上分配,使用完分配新的TLAB時才需要同步
  4. 分配完成後內存空間全部初始化為零值

對象的內存布局

布局:對象頭Header、實例數據Instance Data 對齊填充 Padding 疑問:為什麼JVM對象地址要8位元組對齊?

對象頭包括MarkWord和類型指針,MarkWord 32bit or 64bit 包括哈希碼、GC分代年齡、鎖狀態標記、線程持有的鎖、偏向線程ID、偏向時間戳

類型指針是非必須的、以來虛擬機實現、如果是Java數組、對象頭還包括數組長度。

實例數據:父類變數在子類變數之前。CompactFields = true 子類較窄變數會插到父類變數的空隙之間。

對象的訪問定位
  1. 使用句柄訪問:在Java堆中劃分出一塊內存做句柄池 reference中存儲的是對象的句柄地址,而句柄中包含了對象實例地址和類型數據地址
  2. 使用對象指針訪問:reference中存儲的是對象地址,需要考慮的是對象布局中如何放置訪問類型數據的指針

各種區域溢出現象

Java堆溢出 -XX:+HeapDumpOnOutOfMemoryError ava.lang.OutOfMemoryError: Java heap space 使用Eclipse Memory Analyzer 進行分析,內存泄露 查看泄露對象到GC Roots的引用鏈

Stack溢出 stack length unable to create new native thread

方法區和運行時常量池溢出 提示PermGen space

DirectMemory溢出時明顯的特徵是dump文件中看不見明顯的異常、文件很小,請檢查是否有NIO調用。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

從零自學Hadoop(24):Impala相關操作上
JPA Advanced Mappings(映射)
PHP將數據導出Excel表中
web組件工具之獲取表單數據:webUtils
第一章之s5pv210啟動順序

TAG:達人科技 |

您可能感興趣

GPU學習筆記
學習VR看VR學習筆記
Git學習筆記(一)
TRIZ創新理論學習筆記
JT中醫基礎理論 筆記
MRCP協議學習筆記-MRCP背景知識介紹
中醫學習筆記
HTTP協議學習筆記
金融學習筆記Day 1
OpenCV 學習筆記(一)認識 OpenCV
中醫基礎理論學習筆記(純乾貨)
Gradle插件學習筆記(一)
課堂筆記:學業上我願做一個「Mad Men」
華為HCNA學習筆記之——VRRP虛擬網關冗餘
Python爬蟲學習筆記總結(一)
Redis學習筆記之基本數據結構
每日一記:Python 函數學習筆記1
Python爬蟲學習筆記總結(二)
學習筆記:人工智慧基礎-機器學習(一)
KRENZ場景光影學習筆記1