> Memory allocation!
同志們好,
保持簡單易懂,我將在這裡僅介紹Java中的記憶體分配的全部內容的基本演練嗎?眾所周知,JVM是一種抽象的計算機,可以使計算機執行程式。JVM載入程式碼,驗證程式碼,執行程式碼,管理記憶體(從OS分配記憶體,管理Java分配(包括堆壓縮和垃圾回收))並提供執行時環境。
記憶體分配是JVM [Java虛擬機器]的一部分。因此,此時瞭解Java為什麼需要JVM而沒有其他語言需要VM的重要性很重要。在許多其他語言中,編譯器為特定系統生成機器程式碼,但是在Java中,Java編譯器始終為虛擬機器(稱為JVM)而不是特定系統生成程式碼。是JVM,它具有依賴於平臺的標籤,因此使Java(一種與平臺無關的程式語言)成為可能。JVM將Java位元組碼轉換為機器可解釋的語言。JVM的兩個主要功能是允許Java程式在任何裝置或作業系統上執行以及管理和最佳化程式記憶體。
記憶體管理是應用於計算機記憶體的一種資源管理形式。記憶體管理的基本要求是提供一種方法,可應程式的要求將部分記憶體分配給程式,並在不再需要時將其釋放以供重用。
如上所述,我們將繼續瞭解有關如何完成記憶體分配以及在記憶體不足的情況下會發生什麼錯誤的概念。記憶體分配是將物理或虛擬記憶體地址空間分配給程序的操作。
JVM記憶體分為多個部分:堆|非堆|其他。堆記憶體是執行時資料區,從中分配了所有java類例項和陣列的記憶體。JVM啟動時會建立堆,並且隨著應用程式的執行,堆的大小可能會增加或減少。非堆記憶體是在JVM啟動時建立的,並存儲每個類的結構,例如欄位和方法資料以及內聯的字串[String Interning是一種僅儲存每個不同的String值的一個副本的方法,一成不變。透過在幾個字串上應用String.intern()將確保所有具有相同內容的字串共享相同的記憶體]。另一個記憶體用於儲存JVM程式碼本身,JVM內部結構,已載入的概要代理程式碼和資料。記憶體分配的兩種基本方法是靜態和動態記憶體分配。
靜態記憶體分配在執行之前分配記憶體,而動態記憶體分配在執行期間將記憶體分配給程序。
記憶體分配是術語“繫結”的一般方面。假設我們聲明瞭一個類型別的變數並建立了對它的引用。為了將任何值儲存到這些變數中,我們必須為其分配記憶體。因此,我們可以將記憶體分配稱為“將記憶體地址分配給變數屬性的行為”
eg: int a = 10;
靜態記憶體分配是指編譯器編譯程式並生成目標檔案時,連結程式將這些目標檔案合併為可執行檔案,並在載入程式的幫助下將此可執行檔案載入到主儲存器中。在靜態分配執行之前,必須知道程序所需的資料大小,從而使其更有效,從而可以更快地執行程序。動態記憶體分配在程式執行期間進行。在這裡,當程式執行時第一次使用實體時,會為它們分配記憶體。它減少了記憶體浪費,因為它分配了實體所需的確切記憶體空間。
記憶體管理是作業系統的功能,該作業系統處理主記憶體並在執行過程中前後移動程序。處理記憶體管理的一些基本概念可能是程序地址空間,靜態|動態載入和連結。
程序地址空間:它是程序在其程式碼中引用的一組邏輯地址。作業系統負責在將記憶體分配給程式時將邏輯地址對映到物理地址。在完成記憶體分配之前和之後,將使用三種類型的地址。符號地址,相對地址和物理地址…符號地址是原始碼中變數名,常量和指令標籤所使用的地址。相對地址是在編譯時從符號地址轉換的地址。當程式載入到主儲存器中時,載入器會生成物理地址。在編譯時,虛擬和物理地址保持不變,但在執行[執行時]時有所不同。靜態與動態載入和連結:在開發程式時應決定選擇靜態還是動態載入。如果我們必須靜態地載入程式,那麼在編譯時,整個程式將被編譯和連結,而不會留下任何外部模組依賴性。連結器將目標程式與其他必要的目標模組以及邏輯地址相結合。而如果我們正在載入動態程式,則編譯器將編譯該程式以及所需的模組依賴關係的引用。該程式將提供。當使用靜態連結時,連結器將程式所需的所有其他模組組合到單個可執行程式中,以避免任何執行時依賴性。而在動態連結的情況下,不需要將實際的模組或庫與程式連結,而是可以附加對thm的引用。在宣告物件時未分配記憶體,而是在引用時分配了記憶體。對於物件的記憶體分配,使用new()方法,因此物件始終分配在堆記憶體中。Java記憶體分配分為“堆”,“堆疊”,“程式碼”和“靜態”部分,以進行有效管理。“程式碼”部分包含位元組碼,“堆疊”包含方法,區域性變數和引用變數,“堆”部分包含“物件”,還可能包含引用變數,“靜態”部分僅包含靜態資料。
記憶體分配中最常見的錯誤是“ java.lang.OutOfMemoryError”,通常,當JVM由於記憶體不足而無法分配物件並且垃圾回收器無法再使用更多記憶體時,通常會引發該錯誤。[我們將在下一篇文章中閱讀有關異常和錯誤的資訊]
希望本文能幫助您更好地瞭解Java中的記憶體分配。
直到下一次…
和平了!