今天,跟大家一起聊聊關於JVM記憶體空間的話題,這也是一線網路大廠面試中常被問及的問題,建議小夥伴們收藏後常常拿出來翻閱,重在理解。好了,不多說了,開始今天的正題。
JVM會把記憶體分割成不同的資料區域,那載入的類別是分配到哪裡呢?
下圖是記憶體的各個區域,包括:方法區、堆疊、虛擬機器堆疊、本機方法堆疊、程式計數器。

方法區
#方法區用於儲存已被虛擬機載入的類別資訊、常數、靜態變數、即時編譯器編譯後的程式碼等資料。類別的載入中提到了類別載入的五個階段。在載入階段,會將位元組流所代表的靜態儲存結構轉換為方法區的執行時間資料結構,在準備階段,會將變數所使用的記憶體都會在方法區中進行分配。
程式計數器
#來一個簡單的程式碼,計算(1 2)*3並回傳
public int cal() { int a = 1; int b = 2; int c = 3; return (a + b) * c; }
這段程式碼在載入到虛擬機器的時候,就變成了以下的字節碼,虛擬機執行的時候,就會一行行執行。

java是多執行緒的,在執行緒切換回來後,它需要知道原先的執行位置在哪裡。用來記錄這個執行位置的,就是程式計數器,為了確保執行緒間的計數器互相不影響,這個記憶體區域是線程私有的。
虚拟机栈
虚拟机栈也是线程私有的,生命周期与线程相同。每个线程都有自己的虚拟机栈,如果这个线程执行了一个方法,就会创建一个栈帧,方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。比如下面的例子,fun1调用fun2,fun2调用fun3,fun3创建Hello对象。
public void fun1() { fun2(); } public void fun2() { fun3(); } public void fun3() { Hello hello = new Hello(); }
调用的时候,流程图如下:

执行完成的时候,流程图如下:

每一个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。局部变量主要是存放方法参数以及方法内部定义的局部变量,操作数栈是一个后入先出栈,当方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。
我们通过上面(1+2)*3的例子,把方法区、程序计数器、虚拟机栈的协同工作理一下。首先通过javap查看它的字节码,经过类加载器加载后,此时这个字节码存在方法区中。stack表示栈深度是2,locals是本地变量的slot个数,args_size是入参的个数,默认是this。栈的深度、本地变量个数,入参个数,都是在编译器决定的。

如下图,指令的位置是方法区,局部变量和操作数栈的位置是虚拟机栈,程序计数器就在程序计数器(这个下面的图就不再重复)。当执行偏地址为0的指令的时候,程序计数器为0,局部变量第一个值是this,当前的指令就是方法区0:iconst_1
,指令iconst_1就是把int常量值1进栈,这个1就到了虚拟机栈的操作数栈中。

当执行偏地址为1的指令的时候,程序计数器为1,把操作数栈的值赋值到局部变量,此时操作数栈清空了,局部变量多了一个1,这条指令执行完,就是对应上面int a=1的语句。

另外b,c兩個語句的賦值,對應2,3,4,5指令,這邊不再重複。執行完5後,如下圖:

執行6的時候,是執行iload_1,就是把第二個int型局部變數壓入堆疊頂,這裡的變數是1。

執行7的時候,是執行iload_2,就是把第三個int型局部變數壓入堆疊頂,這裡的變數是2。

執行8的時候,是iadd語句,指的是棧頂的兩個int型元素出棧,得到結果後再壓入棧頂。

執行9的時候,把堆疊頂的元素3,賦值到第五個局部變數。

執行到11的時候,把第五個局部變數值壓入棧頂,執行到13的時候,把第四個局部變數值壓入棧頂,執行14的時候,棧頂的兩個int型元素出棧,相乘後的結果入棧,執行15的時候,從目前方法返回目前棧頂int型元素。這些與上面的相加差不多,就不再贅述了。
堆
堆記憶體區域的唯一目的就是要存放物件實例,幾乎所有的物件實例都在這裡分配記憶體。例如上面的fun1呼叫fun2,fun2呼叫fun3,fun3建立Hello物件。 fun3方法中建立物件時,就是在堆中創建的,並且把位址賦值給fun3的局部變數。 Java堆中還可細分為:新生代與老年代;新生代也細分為Eden空間、From Survivor空間、To Survivor空間。

總結
#整體流程如下,先把java文件編譯成class文件,透過類別載入器載入到方法區。執行緒呼叫方法的時候,會創建一個棧幀,讀取方法區的字節碼執行指令,執行指令的時候,會把執行的位置記錄在程式計數器中,如果創建對象,會在堆內存中創建,方法執行完,這個棧幀就會出棧。

#相關參數
#-XX:PermSize:永久代記憶體容量。
-XX:MaxPermSize:永久代最大記憶體容量。
-XX:MetaspaceSize :元空間初始值的大小
##-XX:MaxMetaspaceSize :元空間最大值大小-XX:CompressedClassSpaceSize :元空間中儲存Klass類元資料部分的空間大小-Xss:堆疊記憶體容量。 -Xms:堆記憶體容量。 -Xmx:堆疊最大記憶體容量,通常和-Xms設定一樣,防止執行時間擴容產生的影響。 -Xmn:新生代記憶體容量,老年代就是堆記憶體容量-新生代記憶體容量-XX:SurvivorRatio=8:新生代還細分為Eden空間、From Survivor空間、To Survivor空間,設定為8代表Eden空間:From Survivor空間:To Survivor空間=8:1:1,例如新生代有10M,那Eden空間佔8M,From Survivor空間、To Survivor空間各佔1M。
以上是案例解說JVM記憶體空間(建議收藏)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Java在不同操作系統上的表現存在細微差異。 1)JVM實現不同,如HotSpot、OpenJDK,影響性能和垃圾回收。 2)文件系統結構和路徑分隔符不同,需使用Java標準庫處理。 3)網絡協議實現差異影響網絡性能。 4)GUI組件外觀和行為在不同系統上有別。通過使用標準庫和虛擬機測試,可減少這些差異的影響,確保Java程序穩定運行。

javaoffersrobustobject-IentiendedProgrammming(OOP)和Top-Notchsecurityfeatures.1)OopinjavainCludesClasses,對象,繼承,多態性,和列出,andeclingfleximaintainablesys.ss.2)SecurityFeateTuersLudEtersludEterMachine(

JavaScriptandJavahavedistinctstrengths:JavaScriptexcelsindynamictypingandasynchronousprogramming,whileJavaisrobustwithstrongOOPandtyping.1)JavaScript'sdynamicnatureallowsforrapiddevelopmentandprototyping,withasync/awaitfornon-blockingI/O.2)Java'sOOPf

JAVAACHIEVESPLATFORMINDEPENTENCETHROUGHJAVAVIRTAILMACHINE(JVM)和BYTECODE.1)THEJVMINTERPRETSBBYTECODE,允許theingthesmecodetorunonanyanyanyanyplatformwithajvm.2)

java'splatformendependecemeansapplicationscanrunonanyplatformwithajvm,使“ Writeonce,runanywhere”。

JVM'SperformanceIsCompetitiveWithOtherRuntimes,operingabalanceOfspeed,安全性和生產性。 1)JVMUSESJITCOMPILATIONFORDYNAMICOPTIMIZAIZATIONS.2)c提供NativePernativePerformanceButlanceButlactsjvm'ssafetyFeatures.3)

JavaachievesPlatFormIndependencEthroughTheJavavIrtualMachine(JVM),允許CodeTorunonAnyPlatFormWithAjvm.1)codeisscompiledIntobytecode,notmachine-specificodificcode.2)bytecodeisisteredbytheybytheybytheybythejvm,enablingcross-platerssectectectectectross-eenablingcrossectectectectectection.2)

TheJVMisanabstractcomputingmachinecrucialforrunningJavaprogramsduetoitsplatform-independentarchitecture.Itincludes:1)ClassLoaderforloadingclasses,2)RuntimeDataAreafordatastorage,3)ExecutionEnginewithInterpreter,JITCompiler,andGarbageCollectorforbytec


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver CS6
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。