JVM垃圾收集器CMS和G1,内存碎片OOM问题

Elisabth 发布于 2014/07/11 14:16
阅读 1K+
收藏 1
使用JVM参数如下时,无OOM,此时使用的是CMS垃圾收集器:

-Xms110m -Xmx110m -XX:PermSize=10m -XX:MaxPermSize=10m -XX:+UseConcMarkSweepGC

使用JVM参数如下时,出现OOM,此时使用的是G1垃圾收集器:

-Xms110m -Xmx110m -XX:PermSize=10m -XX:MaxPermSize=10m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:GCPauseIntervalMillis=3000

程序代码:

import java.util.ArrayList;
import java.util.List;


public class G1Test {
public static void main(String[] args) throws Exception {
List<Byte[]> list = new ArrayList<Byte[]>();


for (int i = 0; i < 25; i++) {
System.out.println(i);
list.add(new Byte[1024 * 1024]);
}


System.out.println("111111111111111111111");
//刪除不连续的数据
list.remove(0);
list.remove(5);
list.remove(8);
list.remove(15);
list.remove(20);
System.out.println(list.get(0));
System.out.println(list.size());


System.out.println("222222222222222222222");


Thread.sleep(1000);
list.add(new Byte[1024 * 1024 * 2]);//存储的数据扩大1倍
list.add(new Byte[1024 * 1024 * 2]);//存储的数据扩大1倍


System.out.println("333333333333333333333");
list.add(new Byte[1024 * 1024]);
System.out.println("44444444444444444444");
}
}



以下是问题补充:

@Elisabth:G1垃圾收集器不会整理内存碎片吗?这个程序的运行结果和我查资料的得到的答案有出入啊 (2014/07/11 14:18)
加载中
0
甘薯
甘薯
有点晕,
你的代码是在哪里出现内存溢出了?

E
Elisabth
请看下我对2、3楼的回复,里面描述的比较清楚,我就不重复了.
0
whaon
whaon

-XX:MaxGCPauseMillis=1000 -XX:GCPauseIntervalMillis=3000

这个时间是不是设置的太大了,调小一点看

E
Elisabth
调小后同样OOM,补充下问题:假设100M的堆内存,分配100个1M的对象放到数组中,然后每隔1个删除一个对象,剩下50个对象,这时候,去创建大小为2M的对象,问能创建对少个对象?程序中的for循环的个数是知道OOM时的上限.我的实验结果是CMS可内存碎片整理,G1收集器则不行
0
星爷
星爷
运行发现没有出错,JDK版本
E
Elisabth
jdk_1.7.0_40,使用G1收集器,调整for循环的个数,直到OOM上限,然后删除若干不连续的对象,然后创建新的对象,新对象的大小是之前的2倍,测试这个新对象能否创建成功!我的G1收集器实验结果是会OOM
返回顶部
顶部