溫馨提示×

溫馨提示×

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

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

Java運行時數據區域的介紹

發布時間:2021-06-21 09:26:02 來源:億速云 閱讀:195 作者:chen 欄目:開發技術

這篇文章主要講解了“Java運行時數據區域的介紹”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java運行時數據區域的介紹”吧!

1. 程序計數器(線程私有)

程序計數器是一塊比較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器(切換線程后,能恢復到正確的執行位置).

2. Java虛擬機棧(線程私有)

(1) 概念  

       虛擬機棧描述的是Java方法執行的內存模型 : 每個方法執行的同時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態鏈接、方法出口 等信息。每一個方法從調用直至執行完成的過程,就對應一個棧幀在虛擬機棧中入棧和出棧的過程。聲明周期與線程相同。

      關于棧幀的理解: 創建啟動一個線程,就創建了一個虛擬機??臻g(存放多個節點,先進后出).可能出現兩種異常: ①StackOverflowError: 方法調用鏈太深(如遞歸); ②OOM

(2) 下面我們來分析一段代碼

public class VMStackTest {
 
    public static void main(String[] args) {
        int m = 1;
        int n = 2;
        swap1(1, 2);
        System.out.printf("main:m=%s, n=%s%n", m, n);
    }
 
    private static void swap1(int m, int n) {
        int tmp = m;
        m = n;
        n = tmp;
        Person p1 = new Person("p1");
        Person p2 = new Person("p2");
        swap2(p1, p2);
        System.out.printf("swap1:p1=%s, p2=%s%n", p1.name, p2.name);
    }
  
    private static void swap2(Person p1, Person p2) {
        Person tmp = p1;
        p1 = p2;
        p2 = tmp;
        System.out.printf("swap2:p1=%s, p2=%s%n", p1.name, p2.name);
    }
 
    static class Person{
        String name;
 
        public Person(String name) {
            this.name = name;
        }
    }
}

這段代碼的執行結果是什么?

       我們知道,Java中只有值傳遞,當為基本數據類型時,傳的是字面值常量,當為引用類型,傳的是地址.

       swap1中,只是修改了方法棧幀中的局部變量,對外面的局部變量不起作用,所以swap1中的交換是無效的.

       swap2中也一樣,只是修改了方法棧幀中的局部變量,對外面的局部變量交換也是無效的. 

所以最終的打印結果為:

Java運行時數據區域的介紹

如果要把p1,p2對象的名稱調換,p1.name="p2", p2.name="p1"(作用在堆里邊的對象)

3. 本地方法棧(線程私有)

       本地方法棧與虛擬機棧的作用完全一樣,他倆的區別無非是本地方法棧為虛擬機使用的Native方法服務,而虛擬機棧為JVM執行的Java方法服務。

4. Java堆(線程共享)

       Java堆(Java Heap)是JVM所管理的最大內存區域。Java堆是所有線程共享的一塊區域,在JVM啟動時創建。此內存區域存放的都是對象實例。JVM規范中說到:"所有的對象實例以及數組都要在堆上分配"。

5. 方法區(線程共享)

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

6. 運行時常量池(方法區的一部分)

(1) 概念

       運行時常量池是方法區的一部分,存放字面量與符號引用。
       字面量 : 字符串(JDK1.7后移動到堆中) 、final常量、基本數據類型的值。
       符號引用 : 類和結構的完全限定名、字段的名稱和描述符、方法的名稱和描述符。

(2) 補充: 其他常量池

① class文件常量池: Java文件編譯為class字節碼文件,存在的常量池,包含字面量和符號引用.
② Java進程運行后,即使沒有執行到某行代碼,也已經把class文件常量池中的內容放在運行時常量池,如下圖:

Java運行時數據區域的介紹

③ 字符串常量池: 1.7之前是在運行時常量池里面,1.7之后,是在堆里面.

感謝各位的閱讀,以上就是“Java運行時數據區域的介紹”的內容了,經過本文的學習后,相信大家對Java運行時數據區域的介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女