Java堆内外jvm内存?

时间:2013-11-20 10:29:03

标签: java jvm

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

但是今天我看到了一张照片,enter image description here

表明,JVM与堆相距很远。

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

5 个答案:

答案 0 :(得分:14)

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

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

JVM

答案 1 :(得分:13)

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

来自The native and Java heaps article on IBM

  

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

     

Java堆包含Java对象的实例,并且经常出现   被称为“堆”。它是由Java维护的   垃圾收集,它是由Java更改的Java堆   命令行堆设置。使用mmap或分配Java堆   shmat如果请求大页面支持。 Java的最大大小   堆在JVM启动期间预先分配为一个连续区域,甚至   如果最小堆大小设置较低。这种分配允许   最小堆大小设置强加的人工堆大小限制   通过堆扩展移动到实际的堆大小限制。

     

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

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

希望它能帮助你理解。

答案 2 :(得分:1)

你混淆了两件事。第一个是进程内存。是的,堆是JVM进程内存的一部分。您图片中标记为“JVM”的内容很可能是JVM的程序代码。它与堆分开是有道理的。实际上,几乎所有程序都有独立的代码/数据区域;我不确定,但我认为操作系统对此负有部分责任。

答案 3 :(得分:1)

jvm只是OS上的一个应用程序,因此它将在OS的memroy上运行。

操作系统将为JVM分配内存(本机+堆+非堆)。

jvm使用本机内存和在JVM上运行的应用程序使用堆和非堆。

答案 4 :(得分:1)

Java正在使用堆和堆外内存。您可以检查完整的内存布局 http://www.slideshare.net/slideshow/embed_code/27597947?startSlide=7