为什么我的单线程java程序消耗超过最大堆大小?

时间:2015-01-15 07:02:04

标签: java jvm heap-memory

我创建了一个简单的java程序: -

import java.util.ArrayList;
import java.util.List;
import java.lang.management.ManagementFactory;

public class OOMError {

    public static List<Person> list = new ArrayList<>();

    public static void main(String args[]){

    System.out.println("Process Id: "+ManagementFactory.getRuntimeMXBean().getName());
        try{
            while(true){
                List<Person> innerList = new ArrayList<>();

                for(int i=0;i<1000000;i++) {
                    list.add(new Person());
                }

                int count = 0;

                while(count < 60){
                    for(int i=0;i<100000;i++){
                        innerList.add(new Person());
                    }
                    Thread.sleep(1000*60);
                    count=count+5;
                }

                Thread.sleep(1000*60*10);

            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public static class Person{
        private String fName ;
        private String lName;

        Person(){
            fName = new String("Stack");
            lName = new String("Overflow");
        }
    }
}

我用导出JAVA_OPTS =&#39; -Xms128m -Xmx1024m&#39;

运行此程序

我正在通过top命令监视我的java应用程序RAM使用情况。

Processes: 94 total, 10 running, 2 stuck, 82 sleeping, 2765 threads                                                                                           06:59:51
Load Avg: 2.62, 2.74, 2.68  CPU usage: 0.11% user, 0.54% sys, 99.33% idle  SharedLibs: 13M resident, 25M data, 0B linkedit.
MemRegions: 28079 total, 19G resident, 24M private, 3449M shared. PhysMem: 2776M wired, 19G active, 3718M inactive, 25G used, 39G free.
VM: 605G vsize, 1199M framework vsize, 118994555(0) pageins, 0(0) pageouts. Networks: packets: 80924129/10G in, 112346940/77G out.
Disks: 4011149/367G read, 9149138/634G written.

PID    COMMAND      %CPU   TIME     #TH   #WQ  #POR #MRE RPRVT  RSHR RSIZE  VPRVT  VSIZ PGRP  PPID  STATE   UID  FAULTS  COW  MSGS MSGR SYSBSD  SYSMACH CSW     PAGE
89038  java         0.0    02:01.65 31    2    112  437  1237M  10M  1251M  2101M  19G  89038 88799 stuck   501  321189  448  651  300  250145+ 358994  304415+ 0

令我惊讶的是,当我的最大堆大小为1024M并且状态即将到来时,我的RSIZE字段是1251M,并且#34;卡住了#34; ?

我的堆满了后会发生什么?申请会终止吗?

我使用的是OS X 10.X.X

1 个答案:

答案 0 :(得分:0)

在JRockit博客中,有一篇文章解释了这一点:

  

命令行参数-Xmx设置最大Java堆大小(mx)。   所有java对象都是在Java堆上创建的,但总内存是   JVM进程的消耗包括更多的东西而不仅仅是   Java堆。几个例子:

     
      
  • 生成(JIT:ed)代码
  •   
  • 已加载的库(包括jar和类文件)
  •   
  • Java堆的控制结构
  •   
  • 线程堆栈
  •   
  • 用户本机内存(malloc:ed in JNI)
  •   

来源:Why is my JVM process larger than max heap size?