您好,登錄后才能下訂單哦!
本篇內容主要講解“如何理解Java中的內存分配”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解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;
靜態內存分配是指編譯器編譯程序并生成目標文件時,鏈接程序將這些目標文件合并為可執行文件,并在加載程序的幫助下將此可執行文件加載到主存儲器中。在靜態分配執行之前,必須知道進程所需的數據大小,從而使其更有效,從而可以更快地執行進程。動態內存分配在程序執行期間進行。在這里,當程序執行時第一次使用實體時,會為它們分配內存。它減少了內存浪費,因為它分配了實體所需的確切內存空間。
內存管理是操作系統的功能,該操作系統處理主內存并在執行過程中前后移動進程。處理內存管理的一些基本概念可能是進程地址空間,靜態|動態加載和鏈接。
(1) 進程地址空間:它是進程在其代碼中引用的一組邏輯地址。操作系統負責在將內存分配給程序時將邏輯地址映射到物理地址。在完成內存分配之前和之后,將使用三種類型的地址。符號地址,相對地址和物理地址…符號地址是源代碼中變量名,常量和指令標簽所使用的地址。相對地址是在編譯時從符號地址轉換的地址。當程序加載到主存儲器中時,加載器會生成物理地址。在編譯時,虛擬和物理地址保持不變,但在執行[運行時]時有所不同。
(2) 靜態與動態加載和鏈接:在開發程序時應決定選擇靜態還是動態加載。如果我們必須靜態地加載程序,那么在編譯時,整個程序將被編譯和鏈接,而不會留下任何外部模塊依賴性。鏈接器將目標程序與其他必要的目標模塊以及邏輯地址相結合。而如果我們正在加載動態程序,則編譯器將編譯該程序以及所需的模塊依賴關系的引用。該程序將提供。當使用靜態鏈接時,鏈接器將程序所需的所有其他模塊組合到單個可執行程序中,以避免任何運行時依賴性。而在動態鏈接的情況下,不需要將實際的模塊或庫與程序鏈接,而是可以附加對thm的引用。
在聲明對象時未分配內存,而是在引用時分配了內存。對于對象的內存分配,使用new()方法,因此對象始終分配在堆內存中。Java內存分配分為“堆”,“堆棧”,“代碼”和“靜態”部分,以進行有效管理。“代碼”部分包含字節碼,“堆棧”包含方法,局部變量和引用變量,“堆”部分包含“對象”,還可能包含引用變量,“靜態”部分僅包含靜態數據。
內存分配中最常見的錯誤是“ java.lang.OutOfMemoryError”,通常,當JVM由于內存不足而無法分配對象并且垃圾回收器無法再使用更多內存時,通常會引發該錯誤。
到此,相信大家對“如何理解Java中的內存分配”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。