欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java內(nèi)存分布歸納整理詳解

 更新時間:2017年04月20日 16:10:11   投稿:wbb  
這篇文章主要介紹了java程序運行時內(nèi)存分布詳解,需要的朋友可以參考下

Java內(nèi)存分布:Java虛擬機在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域:方法區(qū)、虛擬機棧、本地方法棧、堆、程序計數(shù)器。

1.程序計數(shù)器

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

分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個計數(shù)器來完成。

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

如果線程正在執(zhí)行的是一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;如果正在執(zhí)行的是Native方法,這個計數(shù)器值則為空,此內(nèi)存區(qū)域是唯一一個子啊Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

2.Java虛擬機棧

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

每一個方法從調(diào)用到執(zhí)行完成,都對應(yīng)著一個棧幀在虛擬機棧中入棧到出棧的過程。

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

3.本地方法棧

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

4.Java堆

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

5.方法區(qū)

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

6.運行時常量池

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

網(wǎng)上很多解釋常量池會以字符串為例:

比如

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很好理解,指向同一個常量池的內(nèi)存地址。

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

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

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

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

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

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

相關(guān)文章

  • Java基礎(chǔ)之static的用法

    Java基礎(chǔ)之static的用法

    這篇文章主要介紹了Java基礎(chǔ)之static的用法,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-05-05
  • 怎么運行用記事本寫的java程序

    怎么運行用記事本寫的java程序

    以下小編就為大家介紹一下,怎么運行用記事本寫的java程序。需要的朋友可以過來參考下
    2013-08-08
  • logback日志輸出格式設(shè)置方式

    logback日志輸出格式設(shè)置方式

    這篇文章主要介紹了logback日志輸出格式設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解

    SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解

    這篇文章主要介紹了SpringAop自定義切面注解、自定義過濾器及ThreadLocal詳解,Aspect(切面)通常是一個類,里面可以定義切入點和通知(切面 = 切點+通知),execution()是最常用的切點函數(shù),需要的朋友可以參考下
    2024-01-01
  • java 排序算法之希爾算法

    java 排序算法之希爾算法

    這篇文章主要介紹了java 排序算法之希爾排序,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 簡單了解springboot中的配置文件相關(guān)知識

    簡單了解springboot中的配置文件相關(guān)知識

    這篇文章主要介紹了簡單了解springboot中的配置文件相關(guān)知識,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • springboot實現(xiàn)攔截器的3種方式及異步執(zhí)行的思考

    springboot實現(xiàn)攔截器的3種方式及異步執(zhí)行的思考

    實際項目中,我們經(jīng)常需要輸出請求參數(shù),響應(yīng)結(jié)果,方法耗時,統(tǒng)一的權(quán)限校驗等。本文首先為大家介紹 HTTP 請求中三種常見的攔截實現(xiàn),并且比較一下其中的差異。感興趣的可以了解一下
    2021-07-07
  • Java如何使用spire進行word文檔的替換詳解

    Java如何使用spire進行word文檔的替換詳解

    創(chuàng)作一份文案經(jīng)常會高頻率地使用某些詞匯,如地名、人名、人物職位等,若表述有誤,就需要整體撤換,下面這篇文章主要給大家介紹了關(guān)于Java如何使用spire進行word文檔的替換的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼

    SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼

    這篇文章主要介紹了SpringBoot中發(fā)送QQ郵件功能的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java正則表達式之分組和替換方式

    Java正則表達式之分組和替換方式

    這篇文章主要介紹了Java正則表達式之分組和替換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論