您的位置:首页 > 娱乐 > 明星 > Java-List集合堆内存溢出

Java-List集合堆内存溢出

2024/10/4 23:47:01 来源:https://blog.csdn.net/weixin_47748878/article/details/137019751  浏览:    关键词:Java-List集合堆内存溢出

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

在这里插入图片描述

在这里插入图片描述

情况二

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

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
在这里插入图片描述

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com