Java-List集合堆内存溢出

news/2024/7/8 2:39:04 标签: java, list, windows

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的时间)。

java">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());
}

在这里插入图片描述

在这里插入图片描述

情况二

java">public static void main(String[] args) {

	List<Object> list = new ArrayList<>();
	Thread thread = new Thread(() -> {
		synchronized (list) {
			while (true) {
				list.add("1");
			}
		}
	}, "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("1");
}

在这里插入图片描述

在这里插入图片描述

对照分析

JVM启动参数:-Xms4g -Xmx4g -XX:NewRatio=4

java">public static void main(String[] args) {
	long start = System.currentTimeMillis();
	List<Object> list = new ArrayList<>();
	Thread thread = new Thread(() -> {
		synchronized (list) {
			while (true) {
				list.add(new Object());
			}
		}
		}, "T");
	thread.start();
	while (true) {
		if (!thread.isAlive()) {
        	System.out.println(System.currentTimeMillis() - start);
        	System.out.println(list.size());
        	break;
        }
	}
	list.add(new Object());
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在指定大小足够大的情况下时,同样的启动参数,为什么GC次数少但是耗时更长?
但是用另外一台电脑,后者速度会更快一点,为什么?
程序运行久,在后面真正耗时的是GC的时间,耗时75秒,总GC将近74秒。

对照规定堆内存

-XX:+PrintGCDetails -Xms1g -Xmx1g -XX:NewRatio=10 -XX:-UseAdaptiveSizePolicy
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5536292.html

相关文章

项目进度管理(信息系统项目管理师)

资源平衡往往导致关键路径改变&#xff0c;通常是延长赶工是在确保工作范围不变的前提下&#xff0c;通过增加资源来缩短活动工期活动定义的输出有&#xff1a;活动清单、活动属性、里程碑清单、变更请求和项目管理计划&#xff08;更新&#xff09;

​埃文科技受邀出席2024 “数据要素×”生态大会​

2024“数据要素”生态大会&#xff08;以下简称“大会”&#xff09;于2024年6月30日在河南省郑州市举办。大会在国家数据局、河南省人民政府等单位的指导下&#xff0c;由中国经济体制改革研究会、中国电子信息产业集团有限公司、郑州市人民政府等共同主办。大会主题为“加快数…

第一节-k8s架构图

一个Deployment&#xff0c;可以由多个不同Node下的Pod组成&#xff0c;每个Pod又由多个Container组成。 区分Deployment是用Labels(key:value)&#xff0c;区分Pod是用PodName&#xff0c;区分Container是用ContainerName。 一个Node可以包含多个不同Deployment中的pod&…

drawio打开不显示,不在当前屏幕的解决方案

如果把drawio拖在外接显示器&#xff0c;关机前没有拖回主屏幕&#xff0c;那么下次打开它时如果用的不是原来那个显示器&#xff0c;它就无法正常显示。在任务栏上能看到有它&#xff0c;但是就是显示不出来。 经过卸载和其他的方式没有解决&#xff0c;就想到了&#xff0c;应…

C++ 彻底搞懂指针(终章)

一是指针基础、NULL指针、void指针、指针初始化 二是指针运算、指针运算表达式分析 三是数组和指针、指针数组、二维数组指针 四是结构体指针、函数指针 本文提纲如下: • 命令行参数 • 指针类型转换 • 复杂指针分析 1. 命令行参数 main函数也可以传入数据,…

入门篇:构建第一个鸿蒙ArkTS应用(Stage模型)

为确保运行效果&#xff0c;本文以使用DevEco Studio NEXT Developer Beta1版本为例&#xff0c;点击此处获取下载链接。 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New &…

C#的多线程UI窗体控件显示方案 - 开源研究系列文章

上次编写了《LUAgent服务器端工具》这个应用&#xff0c;然后里面需要新启动一个线程去对文件进行上传到FTP服务器&#xff0c;但是新线程里无法对应用主线程UI的内容进行更改&#xff0c;所以就需要在线程里设置主UI线程里控件信息的方法&#xff0c;于是就有了此博文。此文记…

AGI系列(7)Reflection 在 AI agent 中的应用实例

斯坦福大学教授吴恩达一直非常推崇AI Agent,之前他提出过AI Agent的四种工作模式,分别是Reflection(反思)、Tool use(工具使用)、Planning(规划)和Multi-agent collaboration(多智能体协同)。 近日,他又开源了一个翻译 AI Agent, 他认为 AI 智能体机器翻译对改进传…