1琳要,JVM運行時數(shù)據(jù)區(qū)
image.png
1)線程私有區(qū)域
pc:程序計數(shù)器衫嵌,當前線程將要執(zhí)行的下一條jvm指令地址闯冷。
本地方法棧:每個線程獨立獨有砂心,調用native方法時使用。
虛擬機棧:每個線程獨有窃躲,存儲棧幀计贰,方法調用時入棧,結束時出棧蒂窒。
2)線程共享區(qū)域
Heap堆:分為s0躁倒、s1、eden洒琢、old等秧秉。幾乎所有的對象實例。通過-Xms衰抑、-Xmx指定堆大小象迎。
方法區(qū):存儲被JVM加載的元數(shù)據(jù)。類信息(字段呛踊、方法)砾淌、常量、靜態(tài)變量等谭网。
運行時常量池:屬于方法區(qū)汪厨,包含字面量(字符串、final常量)愉择、符號引用劫乱。
3)直接內存
不屬于JVM運行時數(shù)據(jù)區(qū)织中,JVM的NIO方法可以分配堆外內存如使用DirectByteBuffer。
2衷戈,棧幀
1)棧幀:
包含局部變量表狭吼、操作數(shù)棧、動態(tài)鏈接殖妇、返回地址刁笙。
image.png
2)方法調用:可以看做棧幀在虛擬機棧中從入棧到出棧的過程。
參數(shù)過多:棧幀中局部變量表過大拉一,該棧幀深度過大采盒。可以將參數(shù)列表使用對象封裝蔚润。
3)局部變量:方法執(zhí)行過程中需要的全部變量磅氨。包含指向當前對象this的引用、方法的參數(shù)嫡纠、其他局部定義變量烦租。
靜態(tài)方法:0位置從參數(shù)列表存儲。
實例方法:0位置存儲當前對象this的引用除盏。
4)方法調用的底層表示:
jvm調用實例方法時叉橱,會將對象引用作為第一個參數(shù)傳遞給方法(局部變量表0位置的this)。如:a.halo("hello"); => Halo.halo(a, "hello")
jvm調用靜態(tài)方法者蠕,Halo.staticHalo("static halo"); 在static方法內部窃祝,不能直接調用非static的方法。
3踱侣,方法區(qū)
1)Method Area
包含已加載的類信息
JDK1.7以后粪小,常量池移至堆中。
方法區(qū)類信息中包含指向堆中Class實例的引用抡句。
image.png
2)類的方法信息
每個棧幀分配多少內存探膊,編譯器可知的。
image.png
4待榔,堆
1)Java Heap:
分為(S0逞壁、S1、Eden)锐锣、Old區(qū)腌闯,不需要是連續(xù)的空間。
image.png
4)JVM堆內存設置
-Xms初始堆雕憔、-Xmx最大堆绑嘹、-Xmn年輕代大小、-XX:SurvivorRatio年輕代Eden和單個S區(qū)的比例橘茉。