我创建了一个简单的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");
}
}
}
我用export java_opts='-xms128m-xmx1024m'运行了这个程序
我通过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?
一旦我的堆满了会发生什么?申请会终止吗?
我正在使用os x 10.x.x
1条答案
按热度按时间wbgh16ku1#
jrockit博客中有一篇文章对此进行了解释:
命令行参数
-Xmx
设置最大java堆大小(mx)。所有java对象都是在java堆上创建的,但是jvm进程的总内存消耗不仅仅是java堆。举几个例子:生成(jit:ed)代码
加载的库(包括jar和类文件)
java堆的控制结构
线程堆栈
用户本机内存(malloc:ed in jni公司)
来源:为什么我的jvm进程大于最大堆大小?