服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - Java中的内存分配

Java中的内存分配

2021-02-28 22:17今日头条闻数起舞 JAVA教程

内存分配是JVM [Java虚拟机]的一部分。因此,此时了解Java为什么需要JVM而没有其他语言需要VM的重要性很重要。

众所周知,JVM是一种抽象的计算机,可以使计算机运行程序。JVM加载代码,验证代码,执行代码,管理内存(从OS分配内存,管理Java分配(包括堆压缩和垃圾回收))并提供运行时环境。

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中的内存分配。

直到下一次…

和平了!

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

延伸 · 阅读

精彩推荐