DrP*_*tay 5 memory garbage-collection jvm
好吧我有一个关于JVM的内存段的问题,我知道每个JVM都会选择实现这个有点不同但它是一个整体概念,应该在所有JVM中保持相同
在运行时期间不使用虚拟机执行的标准C/C++程序在运行时期间有四个内存段,代码/堆栈/堆/数据所有这些内存段在运行时由操作系统自动分配.
但是,当JVM执行Java编译的程序时,在运行时它有5个内存段
方法区/堆/ Java堆栈/ PC寄存器/本机堆栈
我的问题是,谁分配和管理那些内存段?操作系统不知道正在运行的java程序,并认为它是作为计算机上的常规程序运行的JVM的一部分,JIT编译,Java堆栈使用,这些操作需要运行时内存分配,以及我是什么无法理解JVM是如何将内存划分为这些内存段的.它绝对不是由操作系统完成的,那些内存段(例如java堆栈)必须是连续的才能工作,所以如果JVM程序只是使用诸如malloc之类的命令来获得最大的大小堆内存并将内存分成几段,我们没有连续记忆的承诺,如果有人可以帮我把这个直接记在脑子里,我会很喜欢它,这一切都混淆了......
当 JVM 启动时,它有数百甚至数千个内存区域。例如,每个线程都有一个堆栈以及一个线程状态区域。每个共享库和 jar 都有一个内存映射。注意:Java 64 位不像 16 位应用程序那样使用段。
谁分配和管理这些内存段?
所有内存映射/区域均由操作系统分配。
操作系统不知道 java 程序正在运行,并认为它是 JVM 的一部分,作为计算机上的常规程序运行,
JVM 作为常规程序运行,但内存分配使用与常规程序相同的机制。唯一的区别是,在 Java 中,对象分配是由 JVM 管理的,但这是唯一以这种方式工作的区域。
JIT 编译、Java 堆栈使用、
JIT 编译发生在普通操作系统线程中,每个 Java 堆栈都是普通线程堆栈。
这些操作需要运行时内存分配,
它确实如此,并且在很大程度上它使用mallocandfree和mapandunmap
我不明白的是 JVM 如何将其内存划分为这些内存段
事实并非如此。堆仅适用于 Java 对象。例如,最大堆不是最大内存使用量,而是一次可以拥有的最大对象数量。
这绝对不是由操作系统完成的,并且这些内存段(例如 java 堆栈)必须是连续的才能工作
您是对的,它们需要在虚拟内存中连续,但操作系统会这样做。在Linux上至少没有使用段,只有一个32位或64位内存区域。
因此,如果 JVM 程序只是使用诸如 malloc 之类的命令来接收堆内存的最大大小并将该内存划分为段,
堆被分为几代或 G1 多个内存块,但这仅适用于对象。
我们不保证连续内存
垃圾收集器要么通过复制内存来对内存进行碎片整理,要么采取措施尝试减少内存,以确保您分配的任何对象都有足够的连续内存。
如果有人能帮助我在我的脑海中弄清楚这一点,我会很高兴,这一切都很混乱......
简而言之,JVM 与任何其他程序一样运行,只不过当 Java 代码运行时,它的对象被分配在托管内存区域中。所有其他内存区域的行为就像在 C 程序中一样,因为 JVM 是 C/C++ 程序。