一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - Java內存分布歸納整理詳解

Java內存分布歸納整理詳解

2020-09-15 14:09wbb JAVA教程

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

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

比如

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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。

希望本篇文章對您有所幫助

原文鏈接:http://www.2cto.com/kf/201703/615454.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人啪啪漫画全文阅读 | yy111111免费观看 | 学生小泬无遮挡女HD | 91精品啪在线观看国产91九色 | 情趣内衣情趣玩具play | 成人免费视频一区二区三区 | 国产日韩欧美在线观看不卡 | 亚洲 欧美 国产 视频二区 | 日本花季传媒2020旧版安卓 | 国产一卡二卡3卡4卡四卡在线视频 | 动漫美女被羞羞产奶 | 9re视频这里只有精品 | 亚洲国产欧美另类va在线观看 | 欧美图片另类小说综合 | 青草娱乐极品免费视频 | 午夜宅男宅女看在线观看 | 175m美女被网友灌醉啪啪玩脚 | 好吊日在线 | 亚洲日本免费 | 欧美xxx000喷水 | 疯狂刺激的3p国产在线 | 亚洲高清一区二区三区久久 | 99热导航| 香蕉免费看一区二区三区 | 成人在线av视频 | 手机在线免费观看高清 | 四虎精品在线观看 | 国产极品麻豆91在线 | 五月天精品视频播放在线观看 | 欧美成人精品福利网站 | 日本不卡视频免费的 | 99久久免费国产精品热 | 40岁女人三级全黄 | 久久毛片视频 | 日产一区二区 | sss在线播放 | 免费的毛片视频 | 极品丝袜老师h系列全文阅读 | 亚洲国产精品无圣光一区二区 | 国产精品视频免费一区二区三区 | 日韩欧美一区二区在线观看 |