我创建了一个简单的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
答案 0 :(得分:0)
在JRockit博客中,有一篇文章解释了这一点:
命令行参数
-Xmx
设置最大Java堆大小(mx)。 所有java对象都是在Java堆上创建的,但总内存是 JVM进程的消耗包括更多的东西而不仅仅是 Java堆。几个例子:
- 生成(JIT:ed)代码
- 已加载的库(包括jar和类文件)
- Java堆的控制结构
- 线程堆栈
- 用户本机内存(malloc:ed in JNI)