首頁 > Java > java教程 > 主體

Java中的記憶體分配

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

java中的記憶體分配可以定義為給java程式或服務分配儲存的過程。 java中的記憶體分配是在JVM(Java虛擬機器)記憶體中完成的,大致分為堆記憶體和非堆記憶體。本文將詳細介紹堆疊記憶體和堆疊記憶體(相當於非堆疊記憶體)是如何分配給Java程式的。

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

Java 中的記憶體分配是如何運作的?

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

Java中的記憶體分配

1.堆記憶體

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

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

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

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

2.堆疊記憶體

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

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

這是java中堆疊和堆疊記憶體的小比較:

             
              Heap Memory          Stack Memory
The entire application uses heap memory during its runtime. The application in parts uses stack memory. That means it is used one at a time during thread execution.
Heap memory is larger than stack memory. Stack memory is small as compared to heap memory.
All objects created during the application are stored in heap memory. Stack memory only stores local variables and references to objects.
Access to heap memory is slow. Access to stack memory is fast as compared to heap memory.
Heap memory is allocated by creating new objects and gets deallocated by a garbage collector. Stack memory is automatically allocated and deallocated with the end in method execution.
Heap memory stays as long as the application is running. Stack memory stays only until a method is executing.
堆記憶體          堆疊記憶體 整個應用程式在運行時使用堆記憶體。 部分應用程式使用堆疊記憶體。這意味著它在線程執行期間一次使用一個。 堆記憶體大於堆疊記憶體。 與堆疊記憶體相比,堆疊記憶體較小。 應用程式期間建立的所有物件都儲存在堆記憶體中。 堆疊記憶體僅儲存局部變數和物件參考。 存取堆記憶體很慢。 與堆疊記憶體相比,存取堆疊記憶體的速度更快。 堆記憶體透過建立新物件來分配,並由垃圾收集器釋放。 堆疊內存在方法執行結束時自動分配和釋放。 只要應用程式運行,堆記憶體就會保留。 堆疊記憶體僅保留到執行方法為止。 表>

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中的記憶體分配

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

1.在Main類別中,進入main方法後,由於id、name是局部變量,因此在堆疊記憶體中創建了一個空間,如下所示:

  • 具有原始值的整數id將儲存在堆疊記憶體中。
  • StudentData 物件 s 的參考儲存在堆疊記憶體中,指向原始 Student 對象,而原始 Student 物件儲存在堆疊記憶體中。

2.對 StudentData 類別建構子的呼叫將會加入到堆疊記憶體的頂端。結果,將儲存以下內容:

  • 呼叫物件的參考。
  • 整數變數 id,值為 11。
  • String類型變數名的引用將指向堆記憶體中字串池中儲存的物件。

3. StudentData類別中宣告的兩個實例變數將儲存在堆記憶體中。

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

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