以下所寫jvm內容都是基於hotspot。
定義:j**a virtual machine - j**a程式的執行環境(j**a 二進位制位元組碼的執行環境)。
好處:比較:
jvm指令->直譯器->機器碼->cpu
1、程式計數器(cpu中的暫存器實現)
定義:program counter register 程式計數器(暫存器)
特點:執行緒私有的
不會存在記憶體溢位
注意:程式計數器是唯一乙個不會出現outofmemoryerror
的記憶體區域,它的生命週期隨著執行緒的建立而建立,隨著執行緒的結束而死亡。
2、虛擬機器棧
棧:執行緒執行需要的記憶體空間
定義:j**a virtual machine stacks(j**a虛擬機器棧)
垃圾**不需要對棧記憶體進行處理,棧幀出棧自動釋放。
指定棧記憶體大小 虛擬機器引數-xss size
棧記憶體並不是越大越好,棧記憶體越大,執行緒數目越少。
區域性變數是執行緒私有的,若不逃離方法的作用範圍(作為其他方法入參/作為反參),不會有安全問題。
3、本地方法棧
作用:給本地方法的執行提供執行的記憶體空間
native method 不是由j**a**編寫的方法,如不能直接與作業系統底層互動。
j**a關鍵字 native,如object類裡的public native int hashcode();
4、堆heap 堆:通過new關鍵字建立的物件都會使用堆記憶體
特點:堆記憶體溢位(j**a.lang.outofmemoryerror: j**a heap space)
指定堆記憶體大小 虛擬機器引數-xmx size
堆記憶體診斷
jps工具
檢視當前系統中有哪些j**a程序
jmap工具
jmap -heap 程序id,檢視某一時刻堆記憶體占用情況
jconsole工具,jvisualvm(堆dump)
圖形介面的,多功能的檢測工具,可以連續監測
5、方法區
方法區是規範,永久代(jdk8以前)或元空間是實現,用於儲存類的資料
方法去記憶體溢位:
指定永久代記憶體大小 虛擬機器引數-xx:maxpermsize=size
元空間預設使用系統記憶體,沒有設定上限
指定元空間記憶體大小 虛擬機器引數-xx:maxmetaspacesize=size
執行時常量池
j**ap -v ***.class 反編譯class檔案的詳細資訊
二進位制位元組碼(類基本資訊,常量池,類方法定義,包含了虛擬機器指令)
stringtable(俗稱:串池)
資料結構上是hashtable結構,不能擴容,取值唯一。
特性:位置:
1.6:永久代 ,垃圾**需要full gc
1.8:堆,垃圾**minor gc即可
效能調優:
指定stringtable大小 虛擬機器引數-xx:stringtablesize=桶個數buckets 桶數調大減少hash衝突
考慮將字串物件是否入池
6、直接記憶體
作業系統的記憶體
direct memory
j**a裡unsafe物件可以分配(allocatememory,setmemory方法)、釋放(freememory方法)直接記憶體。j**a垃圾**只限於j**a記憶體
分配和**原理:
system.gc()是full gc 虛擬機器引數-xx:+disableexplicitgc可以禁用顯示的垃圾**
jvm記憶體結構
方法區用於存放類 class檔案 的相關資訊,如類名,訪問修飾符 常量池 字段描述 方法描述等資訊。方法區的一部分,存放編譯時期生成的各種字面量和符號引用,例如 字串!每個方法被執行的時候都會同時建立乙個棧幀用於存放方法內部的區域性變數等資訊。每乙個方法被呼叫直至執行完成的過程,就對應著乙個棧幀在虛...
JVM記憶體結構
所有的j a開發人員可能會遇到這樣的困惑?我該為堆記憶體設定多大空間呢?outofmemoryerror的異常到底涉及到執行時資料的哪塊區域?該怎麼解決呢?其實如果你經常解決伺服器效能問題,那麼這些問題就會變的非常常見,了解 jvm記憶體也是為了伺服器出現效能問題的時候可以快速的了解那塊的記憶體區域...
jvm記憶體結構(一)
學習之餘,整理了下jvm的資料 堆 需要重點關注的一塊區域,涉及到記憶體的分配與 方法區 用於儲存已經被虛擬機器載入的類資訊 常量 靜態變數等資料,也叫永久區 常量池 用於存放編譯期生成的各種字面量和符號引用 jdk6在方法區 jdk7在堆中 虛擬機器棧 棧裡面存放著各種基本資料型別和物件的引用 方...