中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的內存分布有哪些

發布時間:2020-11-17 16:03:37 來源:億速云 閱讀:132 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關Java中的內存分布有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

Java內存分布:Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域:方法區、虛擬機棧、本地方法棧、堆、程序計數器。

1.程序計數器

程序計數器是一塊較小的內存空間,它可以看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型中,字節碼解釋器工作時就是通過改變這個計數器的值來選取嚇一條需要執行的字節碼指令。

分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。

為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,所以該類內存區域為 “線程私有“ 的內存。

如果線程正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果正在執行的是Native方法,這個計數器值則為空,此內存區域是唯一一個子啊Java虛擬機規范中沒有規定任何OutOfMemoryError情況的區域。

2.Java虛擬機棧

與程序計數器一樣,Java虛擬機棧也是線程私有的,它的生命周期和線程相同。虛擬機棧描述的是Java方法執行的內存模型;每個方法在執行的同時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。

每一個方法從調用到執行完成,都對應著一個棧幀在虛擬機棧中入棧到出棧的過程。

局部變量表存放了編譯期可知的各種基本數據類型、對象引用(不等同于對象,是指向對象的引用)和returnAddress類型。如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常,如果無法申請到足夠的內存會拋出OutOfMemory異常。

3.本地方法棧

本地方法棧和虛擬機棧之間的區別是虛擬機棧為虛擬機執行的Java(字節碼)服務,而本地方法棧則為虛擬機使用到的Native方法服務。

4.Java堆

Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,Java堆是垃圾回收器管理的主要區域

5.方法區

方法區和Java堆一樣,是各個線程共享的內存區域,用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。

6.運行時常量池

運行時常量池是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容將會在類加載后進入方法區的運行時常量池中存放。

網上很多解釋常量池會以字符串為例:

比如

String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
 
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // true
System.out.println(s1 == s4); // false
System.out.println(s1 == s9); // false
System.out.println(s4 == s5); // false
System.out.println(s1 == s6); // true

s1==s2為true很好理解,指向同一個常量池的內存地址。

s1==s3為true:對于s3而言,由于拼接的都是字面量,那么編譯器會進行優化,其實就是指s3="Hello"

s1==s4為false:由于new String("lo")并不是一個字面量,而是一個變量,這樣的話編譯器不會進行優化,因為該變量可能會發生變化。

s1==s9為false:和上面一樣的道理。

s4==s5:兩個不同對象的引用當然不同。

s1==s6:由于String.intern()方法是指:如果常量池已經包含一個等于此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對象添加到池中,并且返回此 String 對象的引用。 它遵循對于任何兩個字符串 s 和 t,當且僅當 s.equals(t) 為 true 時,s.intern() == t.intern() 才為 true。

看完上述內容,你們對Java中的內存分布有哪些有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

出国| 内江市| 逊克县| 天长市| 绩溪县| 察哈| 莲花县| 彰化县| 顺昌县| 天水市| 浠水县| 丰镇市| 章丘市| 正宁县| 阿尔山市| 林周县| 凉城县| 广宗县| 长岭县| 东海县| 新巴尔虎左旗| 聂拉木县| 山阴县| 巨鹿县| 改则县| 麻城市| 青阳县| 怀来县| 凤山县| 桂阳县| 顺平县| 岳池县| 榆社县| 延庆县| 临清市| 顺义区| 北安市| 沈丘县| 岢岚县| 台前县| 洛南县|