Java-List集合堆内存溢出-情况一

往List<Object>的集合中不断插入元素,集合底层的数组会不断扩容,从0 -> 10 -> 10 + 10>>1…。最终出现堆内存溢出,是在扩容数组大小的时候。这里的过程会比下面之间add(“1”)出现内存溢出的时间要长,但是容量比其要小。
说明Object的对象创建会占用一定的空间;数组里面存放执行堆的内存地址也是需要占用空间的;GC扫描这些对象所花的时间也长(-XX:+PrintGCDetails -Xms4g -Xmx4g -XX:NewRatio=4,可以看到不断有GC日志打印,加上jstat -gc pid查询GC的耗时,以及T线程出现内存溢出时,main线程出现异常等待的时间就是最近一次add触发GC的时间)。

public static void main(String[] args) {

	List<Object> list = new ArrayList<>();
	Thread thread = new Thread(() -> {
		synchronized (list) {
			while (true) {
				list.add(new Object());
			}
		}
	}, "T ");
	
	thread.start();
	try {
		Thread.sleep(100);
	} catch (InterruptedException e) {
		throw new RuntimeException(e);
	}
	Iterator<Object> iterator = list.iterator();
	while (iterator.hasNext()){
		if (!thread.isAlive()){
			System.out.println(list.size());
				break;
		}
	}
	list.add(new Object());
}

在这里插入图片描述

在这里插入图片描述

上一篇:C-语言特性相关


下一篇:如何快速使用C语言操作sqlite3