众所周知,JVM是一个抽象的计算机,它使计算机能够运行程序。JVM加载代码、验证代码、执行代码、管理内存(从OS分配内存、管理Java分配(包括堆压缩和垃圾收集))并提供运行时环境。内存分配是JVM[Java虚拟机]的一部分。所以在这一点上理解为什么Java需要JVM而没有其他语言需要VM是很重要的。在许多其他语言中,编译器为特定系统生成机器代码,但在Java中,Java编译器总是为虚拟机(称为JVM)而不是特定系统生成代码。是JVM,它具有平台相关的标签,从而使Java这种与平台无关的编程语言成为可能。JVM将Java字节码转换为机器可解释的语言。JVM的两个主要功能是让Java程序可以运行在任何设备或操作系统上,以及管理和优化程序内存。内存管理是一种适用于计算机内存的资源管理形式。内存管理的一个基本要求是提供一种方法,通过该方法可以在程序需要时将内存部分分配给程序,并在不再需要时释放以供重用。为了更好地理解本文,建议您在继续之前阅读本文。如上所述,我们将继续了解内存分配是如何完成的概念以及在内存不足的情况下会发生什么错误。内存分配是为进程分配物理或虚拟内存地址空间的行为。JVM内存分为多个部分:堆、非堆和其他。堆内存是运行时数据区域,从中分配所有java类实例和数组的内存。堆是在JVM启动时创建的,随着应用程序的运行,堆的大小可能会增加或减少。非堆内存在JVM启动时创建,并存储每个类的结构,例如字段和方法数据以及内联的字符串[StringInterning是一种只存储每个不同String值的一个副本的方法,它不会改变.通过在多个字符串上应用String.intern()将确保具有相同内容的所有字符串共享相同的内存]。另一个内存用于存储JVM代码本身、JVM内部结构、加载的配置文件代理代码和数据。内存分配的两种基本方法是静态和动态内存分配。静态内存分配在执行前分配内存,而动态内存分配在执行期间为进程分配内存。内存分配是术语“绑定”的一般方面。假设我们声明一个类类型的变量并创建对它的引用。为了将任何值存储到这些变量中,我们必须为它们分配内存。因此,我们可以将内存分配称为“将内存地址分配给变量属性的行为”eg:inta=10;静态内存分配是指当编译器编译程序并生成目标文件时,链接器将这些目标文件合并为可执行文件并在加载器的帮助下将这个可执行文件加载到主存中。在执行静态分配之前必须知道进程所需数据的大小,从而使其更有效,从而允许更快地执行进程。动态内存分配发生在程序执行期间。在这里,内存是在程序执行期间首次使用时为实体分配的。它减少了内存浪费,因为它分配了实体所需的确切内存空间。内存管理是操作系统的功能,它处理主内存并在执行期间来回移动进程。处理内存管理的一些基本概念可能是进程地址空间、静态|动态加载和链接。(1)进程地址空间:进程在其代码中引用的一组逻辑地址。操作系统在为程序分配内存时负责将逻辑地址映射到物理地址。在内存分配完成之前和之后,使用了三种类型的地址。符号地址、相对地址和物理地址……符号地址是源代码中变量名、常量和指令标签使用的地址。相对地址是编译时从符号地址转换而来的地址。当一个程序被加载到主存中时,加载器生成物理地址。在编译时,虚拟地址和物理地址保持不变,但在执行[运行时]时不同。(2)静态和动态加载和链接:在开发程序时,应决定是选择静态加载还是动态加载。如果我们必须静态加载程序,那么在编译时整个程序将被编译和链接,而不会留下任何外部模块依赖性。链接器将目标程序与其他必要的目标模块和逻辑地址组合在一起。而如果我们正在加载动态程序,编译器将编译程序以及对所需模块依赖项的引用。该程序将提供。使用静态链接时,链接器将程序所需的所有其他模块组合到一个可执行程序中,避免任何运行时依赖性。而在动态链接的情况下,可以附加对thm的引用,而不是将实际模块或库与程序链接。内存不是在声明对象时分配的,而是在引用对象时分配的。对于对象的内存分配,使用了new()方法,所以对象总是分配在堆内存中。Java内存分配分为“堆”、“栈”、“代码”和“静态”部分,以进行高效管理。“代码”部分包含字节码,“堆栈”部分包含方法、局部变量和引用变量,“堆”部分包含“对象”和可能的引用变量,“静态”部分仅包含静态数据。内存分配中最常见的错误是“java.lang.OutOfMemoryError”,通常在JVM由于内存不足而无法分配对象,垃圾收集器无法使用更多内存时抛出。希望本文能帮助您更好地理解Java中的内存分配。直到下一次……和平!原文链接:https://medium.com/javamadetranquil/memory-allocation-in-java-fb2d4498a3ed
