jvm內存結構詳細

JVM內存結構

 
JVM在運行時將數據劃分爲了6個區域來存儲
 
1、PC Register(PC寄存器):很小的內存區域。
主要作用:記錄當前線程所執行的字節碼的行號(標識)。
 
     在jvm中多個線程的實現是通過輪流分配處理器(CPU)時間的方式來實現的,即在任何一個確定的時間裏,在處理器的內核之後執行
一個線程的指令,因此爲了線程(棧)等待結束需要恢復到正確的位置執行,
每條線程都有一個獨立的程序計數器(PC寄存器)來記錄當前指令的行號(標識)。計數器(PC寄存器)之間相互獨立不影響,
這塊內存爲線程獨立內存(PC寄存器)

2、jvm棧(線程私有
在Sun JDK中可以通過-Xss來指定棧的大小。
介紹:
棧中存放基礎數據類型,自定義對象的引用(非對象)
每個線程一個棧區,棧內數據私用,線程獨享
棧分三部分基本類型變量、執行環境上下文、操作指令區
優缺點:速度快,但是大小、生命週期固定,不靈活

3、本地棧
  跟jvm棧非常相似,區別在於jvm棧爲虛擬機執行Java方法服務,
  而本地方法棧則爲jvm使用到Native方法服務。

4、堆( Heap)
java堆是和應用程序關係最爲密切的內存空間,幾乎所有的對象都存放在堆上。
並且java堆是完全自動化管理的,通過垃圾回收機制,垃圾對象會被自動清理,而不需要顯示的釋放。
其大小通過-Xmx來控制,
-Xms爲JVM啓動時申請的最小Heap內存,默認爲物理內存的1/64但小於1G,
-Xmx爲JVM可申請的最大Heap內存,默認爲物理內存的1/4,默認當空餘堆內存小於40%時。
可通過-XX:MinHeapFreeRatio=來指定這個比例。
注: 當堆中需要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。
介紹:
堆中存放對象
jvm中只有一個堆區,各線程共享
優缺點:內存是動態的,生命週期不定GC自動回收,速度慢

5、 方法區域 (MethodArea)
也叫靜態區,所有線程共享
存放 類的信息,常量和靜態變量,即類被編譯後的數據
包含的是在整個程序中永遠唯一的元素,如:class,static變量
在Sun JDK中這塊區域對應的爲PermanetGeneration,又稱爲持久代,默認爲64M,可通過-XX:PermSize以及-XX:MaxPermSize來指定其大小。
 

6、直接內存
堆外內存,並非虛擬機數據區的一部分,可以分配的,大小受本機內存限制
與堆區相比,IO讀寫性能要優於堆區,頻繁申請更耗費性能 
堆內外內存比較:
直接內存的IO訪問效率要高於非直接內存的訪問效率
原因:
本地IO會直接操作直接內存,而非直接內存的話,會比直接內存多操作一步,堆內存copy到直接內存這步。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章