首頁 > Java > java教程 > 主體

Java 中的記憶體類型

王林
發布: 2024-08-30 15:17:29
原創
306 人瀏覽過

Java虛擬機記憶體區域是一個運行時區域,用於執行java應用程式運行時涉及的各種程序,JVM的記憶體區域大致分為五個不同的部分,分別是方法區、堆區、堆疊、程式計數器(PC)暫存器區域和本機方法區域。在本文中,我們將討論 Java 中不同類型的記憶體。

廣告 該類別中的熱門課程 JAVA 掌握 - 專業化 | 78 課程系列 | 15 次模擬測驗

Java 中最常見的 5 種記憶體類型

眾所周知,java是一種物件導向的語言;因此,Java中建立的所有物件都儲存在JVM(Java虛擬機器)中。 JVM記憶體基本上分為以下幾個部分:

1。方法區

所有正在執行的線程共享這部分JVM記憶體區域。類別元素,如常數池、類別欄位、建構函式程式碼、方法程式碼等。方法區可以被視為堆區的一部分,但僅儲存每個類別的資料。可以說方法區負責保存類別層級的資訊。

2。堆記憶體

java中的堆記憶體被java運行時用來在java程式執行期間​​為物件和類別分配記憶體。每當在java中建立一個物件時,它就會儲存在堆記憶體中。垃圾收集過程在堆記憶體上運行,以釋放不必要的空間,即垃圾收集從堆區域中刪除那些沒有任何引用的物件。 java中的堆內存分為以下幾個部分:

  • 年輕代:這是放置所有新建立的物件的部分。當 Java 堆的這一部分被填滿時,會發生一次小型垃圾回收以釋放空間。
  • 老年代:小垃圾回收後記憶體中剩餘的所有物件都會移入老年代。因此,這是堆記憶體中存在長期存活物件的部分。
  • 永久代:JVM 的這一部分包含本機和靜態方法,為運行 Java 應用程式提供元資料。

以下是有關 Java 堆記憶體的一些重點:

  • 如果堆空間已滿,java 會拋出 OutOfMemory 錯誤。
  • 與堆疊記憶體相比,存取堆疊記憶體的速度較慢。
  • 與堆疊記憶體相比,堆記憶體的大小大得多。
  • 堆記憶體不是線程安全的,因為所有物件都共享它。
  • 堆記憶體中不存在自動釋放,因為它需要垃圾收集器來釋放空間。

3。堆疊記憶體

顧名思義,堆疊記憶體是基於 LIFO(後進先出)原則。堆疊記憶體用於靜態記憶體分配,java程式中的每個執行線程都有自己的堆疊記憶體。每當呼叫 Java 方法時,都會在 Java 堆疊記憶體中建立一個新區塊,用於保存本機或中間變數以及對方法中其他物件的參考。一旦該方法執行完成,堆疊中的記憶體區塊就會變空並被下一個方法使用。與堆疊記憶體相比,堆疊記憶體的大小較小。以下是堆疊記憶體的一些重要特性。

  • 隨著新方法加入堆疊記憶體和從堆疊記憶體中刪除,堆疊記憶體分別會自行增長和縮小。
  • 方法完成執行後,堆疊記憶體會自動分配和釋放。
  • 與堆疊記憶體相比,存取堆疊記憶體的速度更快。
  • 每當堆疊記憶體滿時,java就會拋出一個稱為堆疊溢位異常的例外。
  • 堆疊記憶體是線程安全的,因為每個執行緒都有自己的堆疊記憶體。

4。 PC暫存器

pc暫存器的主要作用是儲存目前執行指令的位址。它還儲存負責執行當前指令的線程的位址。分配給pc暫存器的記憶體大小非常小。在 JVM 中執行的 Java 應用程式不會對 PC 暫存器記憶體或其內容產生任何影響。

5。原住民地區

該區域是使用java以外的語言實現的。隨著新線程的創建,記憶體將在該區域中為每個創建的線程分配。原生區域的大小可以是固定的,也可以是動態的。

Java 中的記憶體範例

現在我們將看到一個顯示記憶體如何分配的 java 範例:

代碼:

package com.edubca.javademo;
class StudentData {
int rollNumber;
String name;
public StudentData(int rollNumber, String name) {
super();
this.rollNumber = rollNumber;
this.name = name;
}
public int getRollNumber() {
return rollNumber;
}
public void setRollNumber(int rollNumber) {
this.rollNumber = rollNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
int id = 11;
String name = "Yash";
StudentData s = null;
s = new StudentData(id, name);
System.out.println("Student Id is " + s.getRollNumber());
System.out.println("Student Name is " + s.getName());
}
}
登入後複製

輸出:

Java 中的記憶體類型

記憶體分配:

現在我們來看看上面的程式中記憶體是如何分配的:

  • 在Main類別中,進入main方法後,由於id,name為局部變量,在堆疊記憶體中創建了一個空間,如下所示:
    • 具有原始值的整數id將儲存在堆疊記憶體中。
    • StudentData 物件 s 的參考儲存在堆疊記憶體中,指向原始 StudentData 對象,而原始 StudentData 物件儲存在堆疊記憶體中。
  • 對 StudentData 類別建構子的呼叫將進一步加入堆疊記憶體的頂端。將儲存以下內容:
    • 呼叫物件的參考。
    • 整數變數 id,值為 11。
    • String類型變數名的引用,它將指向堆記憶體中字串池中儲存的實際物件。
  • 在StudentData類別中宣告的兩個名為studentId和studentName的實例變數將會儲存在堆記憶體中。

以上是Java 中的記憶體類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板