【问题标题】:No garbage collector has time to collect SoftReference, always OutOfMemoryError没有垃圾收集器有时间收集 SoftReference,总是 OutOfMemoryError
【发布时间】:2022-01-15 20:30:26
【问题描述】:

尝试了所有垃圾收集器,一百万种不同的设置组合。 但结果总是一样的——OutOfMemoryError。

谁能告诉哪个垃圾收集器能够及时删除软引用所引用的对象

下面的示例模拟器代码

package com;

import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;

class SoftReferenceCollector {

    private static class Data {
        public long[] l = new long[100];
    }

    private List<SoftReference<Data>> list = new ArrayList<>();

    public void startFillCollection(int durationInSec) {
        long i = 0;

        long start = System.currentTimeMillis();
        long end = start + durationInSec * 1000;
        while (System.currentTimeMillis() < end) {
            list.add(new SoftReference<>(new Data()));
            ++i;
            if (i % 10000 == 0) {
                sleep(1);
                if (i % 1_000_000 == 0)
                    sleep(1000);
            }
        }
    }

    private void sleep(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException ignored) {
        }
    }
}


public class Main6 {
    public static void main(String[] args) {
        SoftReferenceCollector softReferenceCollector = new SoftReferenceCollector();
        softReferenceCollector.startFillCollection(11240);

    }
}

【问题讨论】:

    标签: java memory garbage-collection soft-references


    【解决方案1】:

    ReferentsSoftReference 引用的对象)在抛出 OOO 异常之前被 GC 清除。

    但没有被垃圾收集的是SoftReference 对象本身。它们也是对象,它们消耗堆内存。它们都被列表保存在内存中。 GC 只清除它们指向的对象,即referent

    使用-XX:+HeapDumpOnOutOfMemoryError 运行您的 JVM。此标志将在 OOO 之前转储堆,以便您稍后对其进行分析。您可以使用 Eclipse 内存分析器。

    您也可以尝试-XX:+PrintReferenceGC 标志,该标志将通过清理这些引用来打印有关 gc 周期所用时间的一些信息。

    【讨论】:

    • usuario,谢谢,您说的完全正确。检查垃圾收集器是否设法删除软链接的最佳方法是什么?毕竟,只需替换 list.add(new SoftReference(new Data()));到新的 SoftReference(new Data());我们还将获得收集器可以轻松访问的 SoftReference 对象
    • SoftReference 对象被强引用,因此 GC 清理它们的唯一方法是使它们无法访问。不要按照您的建议存储他们的参考资料,也不要从列表中删除他们的参考资料。不确定您要达到什么目标,但您应该查看WeakHashmap 以获得灵感。
    • usuario,谢谢
    • usuario,我看到你在使用内存方面有很强的经验,也许你可以回答这个主题的问题link我将非常感激
    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2016-07-30
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多