自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java中的內存分配

開發(fā) 后端
內存分配是JVM [Java虛擬機]的一部分。因此,此時了解Java為什么需要JVM而沒有其他語言需要VM的重要性很重要。

眾所周知,JVM是一種抽象的計算機,可以使計算機運行程序。JVM加載代碼,驗證代碼,執(zhí)行代碼,管理內存(從OS分配內存,管理Java分配(包括堆壓縮和垃圾回收))并提供運行時環(huán)境。

[[384034]]

內存分配是JVM [Java虛擬機]的一部分。因此,此時了解Java為什么需要JVM而沒有其他語言需要VM的重要性很重要。在許多其他語言中,編譯器為特定系統生成機器代碼,但是在Java中,Java編譯器始終為虛擬機(稱為JVM)而不是特定系統生成代碼。是JVM,它具有依賴于平臺的標簽,因此使Java(一種與平臺無關的編程語言)成為可能。JVM將Java字節(jié)碼轉換為機器可解釋的語言。JVM的兩個主要功能是允許Java程序在任何設備或操作系統上運行以及管理和優(yōu)化程序內存。

內存管理是應用于計算機內存的一種資源管理形式。內存管理的基本要求是提供一種方法,可應程序的要求將部分內存分配給程序,并在不再需要時將其釋放以供重用。

為了更好地理解本文,建議您先閱讀本文,然后再繼續(xù)。

如上所述,我們將繼續(xù)了解有關如何完成內存分配以及在內存不足的情況下會發(fā)生什么錯誤的概念。內存分配是將物理或虛擬內存地址空間分配給進程的操作。

JVM內存分為多個部分:堆、非堆、其他。

  • 堆內存是運行時數據區(qū),從中分配了所有java類實例和數組的內存。JVM啟動時會創(chuàng)建堆,并且隨著應用程序的運行,堆的大小可能會增加或減少。
  • 非堆內存是在JVM啟動時創(chuàng)建的,并存儲每個類的結構,例如字段和方法數據以及內聯的字符串[String Interning是一種僅存儲每個不同的String值的一個副本的方法,一成不變。通過在幾個字符串上應用String.intern()將確保所有具有相同內容的字符串共享相同的內存]。另一個內存用于存儲JVM代碼本身,JVM內部結構,已加載的概要代理代碼和數據。內存分配的兩種基本方法是靜態(tài)和動態(tài)內存分配。
  • 靜態(tài)內存分配在執(zhí)行之前分配內存,而動態(tài)內存分配在執(zhí)行期間將內存分配給進程。

內存分配是術語“綁定”的一般方面。假設我們聲明了一個類類型的變量并創(chuàng)建了對它的引用。為了將任何值存儲到這些變量中,我們必須為其分配內存。因此,我們可以將內存分配稱為“將內存地址分配給變量屬性的行為”

  1. eg: int a = 10

靜態(tài)內存分配是指編譯器編譯程序并生成目標文件時,鏈接程序將這些目標文件合并為可執(zhí)行文件,并在加載程序的幫助下將此可執(zhí)行文件加載到主存儲器中。在靜態(tài)分配執(zhí)行之前,必須知道進程所需的數據大小,從而使其更有效,從而可以更快地執(zhí)行進程。動態(tài)內存分配在程序執(zhí)行期間進行。在這里,當程序執(zhí)行時第一次使用實體時,會為它們分配內存。它減少了內存浪費,因為它分配了實體所需的確切內存空間。

內存管理是操作系統的功能,該操作系統處理主內存并在執(zhí)行過程中前后移動進程。處理內存管理的一些基本概念可能是進程地址空間,靜態(tài)|動態(tài)加載和鏈接。

(1) 進程地址空間:它是進程在其代碼中引用的一組邏輯地址。操作系統負責在將內存分配給程序時將邏輯地址映射到物理地址。在完成內存分配之前和之后,將使用三種類型的地址。符號地址,相對地址和物理地址…符號地址是源代碼中變量名,常量和指令標簽所使用的地址。相對地址是在編譯時從符號地址轉換的地址。當程序加載到主存儲器中時,加載器會生成物理地址。在編譯時,虛擬和物理地址保持不變,但在執(zhí)行[運行時]時有所不同。

(2) 靜態(tài)與動態(tài)加載和鏈接:在開發(fā)程序時應決定選擇靜態(tài)還是動態(tài)加載。如果我們必須靜態(tài)地加載程序,那么在編譯時,整個程序將被編譯和鏈接,而不會留下任何外部模塊依賴性。鏈接器將目標程序與其他必要的目標模塊以及邏輯地址相結合。而如果我們正在加載動態(tài)程序,則編譯器將編譯該程序以及所需的模塊依賴關系的引用。該程序將提供。當使用靜態(tài)鏈接時,鏈接器將程序所需的所有其他模塊組合到單個可執(zhí)行程序中,以避免任何運行時依賴性。而在動態(tài)鏈接的情況下,不需要將實際的模塊或庫與程序鏈接,而是可以附加對thm的引用。

在聲明對象時未分配內存,而是在引用時分配了內存。對于對象的內存分配,使用new()方法,因此對象始終分配在堆內存中。Java內存分配分為“堆”,“堆棧”,“代碼”和“靜態(tài)”部分,以進行有效管理。“代碼”部分包含字節(jié)碼,“堆棧”包含方法,局部變量和引用變量,“堆”部分包含“對象”,還可能包含引用變量,“靜態(tài)”部分僅包含靜態(tài)數據。

內存分配中最常見的錯誤是“ java.lang.OutOfMemoryError”,通常,當JVM由于內存不足而無法分配對象并且垃圾回收器無法再使用更多內存時,通常會引發(fā)該錯誤。

希望本文能幫助您更好地了解Java中的內存分配。

直到下一次…

和平了!

原文鏈接:https://medium.com/javamadetranquil/memory-allocation-in-java-fb2d4498a3ed

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2009-06-03 15:52:34

堆內存棧內存Java內存分配

2010-09-25 14:12:50

Java內存分配

2011-07-15 01:10:13

C++內存分配

2015-11-16 11:22:05

Java對象內存分配

2015-07-08 10:51:27

Objective-CRuntime

2023-11-21 08:03:43

語言架構偏移量

2010-09-17 16:14:22

Java內存分配

2021-12-22 06:56:07

STM32C語言內存

2011-07-11 18:02:50

java

2011-07-11 18:10:28

java

2023-03-06 00:13:58

IOT內存物聯網

2010-09-25 14:38:18

Java內存分配

2018-02-08 14:57:22

對象內存分配

2021-12-16 06:52:33

C語言內存分配

2010-09-25 15:40:52

配置JVM內存

2010-09-09 10:09:07

Java內存分配

2011-08-16 15:13:49

IOS編程內存

2021-07-14 10:00:32

Python內存測量

2018-04-08 08:45:53

對象內存策略

2022-03-16 08:39:19

StackHeap內存
點贊
收藏

51CTO技術棧公眾號