memory - JVM 内存段分配

标签 memory garbage-collection jvm

好吧,我有一个关于 JVM 内存段的问题,
我知道每个 JVM 都会选择实现这一点,但它是一个整体概念,在所有 JVM 中应该保持相同

在运行时不使用虚拟机执行的标准 C/C++ 程序在运行时有四个内存段,
代码/堆栈/堆/数据
所有这些内存段都是由操作系统在运行时自动分配的。

但是,当 JVM 执行 Java 编译程序时,在运行时它有 5 个内存段

方法区/堆/Java堆栈/PC寄存器/ native 堆栈

我的问题是,谁分配和管理这些内存段?
操作系统不知道正在运行的 java 程序,并认为它是作为计算机上常规程序运行的 JVM 的一部分,JIT 编译,Java 堆栈使用,这些操作需要运行时内存分配,而我是什么未能理解 JVM 如何将其内存划分为这些内存段。
这绝对不是由操作系统完成的,并且那些内存段(例如 java 堆栈)必须是连续的才能工作,所以如果 JVM 程序将简单地使用诸如 malloc 之类的命令来接收最大大小堆内存并将内存划分为段,我们不能保证连续内存,如果有人能帮我把这件事弄清楚,我会很高兴的,这一切都混在一起了......

最佳答案

当 JVM 启动时,它有数百个甚至数千个内存区域。例如,每个线程都有一个堆栈以及一个线程状态区域。每个共享库和 jar 都有一个内存映射。注意:Java 64 位不像 16 位应用程序那样使用段。

who allocates and manages those memory segments?



所有内存映射/区域均由操作系统分配。

The operating system is NOT aware of a java program running and thinks it is a part of the JVM running as a regular program on the computer,



JVM 作为普通程序运行,但是内存分配使用与普通程序相同的机制。唯一的区别是在 Java 中对象分配由 JVM 管理,但这是唯一以这种方式工作的区域。

JIT compilation, Java stacks usage,



JIT 编译发生在一个普通的 OS 线程中,每个 Java 堆栈都是一个普通的线程堆栈。

these operations require run-time memory allocation,



确实如此,而且大部分情况下它使用mallocfreemapunmap

And what I'm failing to understand Is how a JVM divides it's memory into those memory segments



它没有。堆仅用于 Java 对象。例如,最大堆不是最大内存使用量,只是您一次可以拥有的最大对象数量。

It is definitely not done by the Operating System, and those memory segments (for example the java stacks) must be contiguous in order to work



您是对的,它们需要在虚拟内存中保持连续,但操作系统会这样做。在 Linux 上至少没有使用段,只有一个 32 位或 64 位内存区域。

so if the JVM program would simply use a command such as malloc in order to receive the maximum size of heap memory and divide that memory into segments,



堆被划分为代或在 G1 中的多个内存块,但这仅用于对象。

we have no promise for contiguous memory



垃圾收集器要么通过复制内存来对内存进行碎片整理,要么采取措施尝试减少内存,以确保为您分配的任何对象提供足够的连续内存。

would love it if someone could help me get this straight in my head, it's all mixed up...



简而言之,JVM 像任何其他程序一样运行,除了当 Java 代码运行时,它的对象被分配在内存的托管区域中。所有其他内存区域的行为就像在 C 程序中一样,因为 JVM 是 C/C++ 程序。

关于memory - JVM 内存段分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35521793/

相关文章:

java - 为数据密集型应用程序的 JVM 提供适当的堆和旧代大小

Java 8 lambda 弱引用

java - JVM 中的 native 库和 native 方法接口(interface)是什么?

memory - 创建指向特定位置的指针

python - 将 python 字典的最坏情况时间复杂度优化为 O(1)

Android OutOfMemory 问题

c# - 大型多维数组(锯齿状数组)C# 的解决方法?

java - 关闭 SQL 连接 Java Webservice

java - 如何禁止 Java VM 在崩溃/将敏感数据写入磁盘时创建任何转储

java - Android:BitmapFactory.decodeByteArray - 降低图像质量