Java堆内外jvm内存?

Bat*_*tty 21 java jvm

直到今天我才知道java有堆,这是由JVM创建的.此外,该内存由OS分配给JVM实例,即堆驻留在JVM实例中.

但今天我看了一张照片, 在此输入图像描述

这表明,JVM与堆相距甚远.

所以,我现在很困惑,任何人都可以让我知道,我之前是否错了,或者我无法理解图片?

Jor*_*pos 14

关于这个问题有很多讨论.我总是喜欢IBM的文章,因为它包含非常好的信息.对于这个具体问题,这里有一段摘录.

来自IBM的本机和Java堆文章:

JVM维护两个内存区域,Java™堆和本机(或系统)堆.这两个堆有不同的用途,并由不同的机制维护.

Java堆包含Java对象的实例,通常称为"堆".它是由Garbage Collection维护的Java堆,它是由命令行堆设置更改的Java堆.如果请求大页面支持,则使用mmap或shmat分配Java堆.即使最小堆大小设置较低,Java堆的最大大小也会在JVM启动期间预先分配为一个连续区域.此分配允许最小堆大小设置强加的人为堆大小限制随堆扩展移动到实际堆大小限制.

本机或系统堆是使用操作系统的底层malloc和free机制分配的,用于特定Java对象的底层实现; 例如:

  • AWT和Swing所需的Motif对象
  • 数据压缩例程的缓冲区,它是Java类库读取或写入压缩数据(如.zip或.jar文件)所需的内存空间.
  • 应用程序JNI代码的Malloc分配
  • 由Just In Time(JIT)编译器生成的编译代码
  • 要映射到Java线程的线程

希望它能帮助你理解.


sar*_*son 14

绿色的JVM很可能不是JVM实例,而是驻留在系统内存中的JVM代码,在Java堆中有您期望的JVM实例.

如果您看下面的图像更清楚,图像中绿色的JVM将位于主机操作系统蓝色区域内

JVM