问题描述:System.gc问题

16 浏览
0 Comments

问题描述:System.gc问题

我正在运行一个调度算法,其中包含一段垃圾收集代码,看起来像这样:

    //garbage collection
    if (state.children.isEmpty()) {//if this is a leaf node (no children)
        state.parent.children.remove(state);
        System.gc();
    }

起初,算法在没有任何暂停的情况下平稳运行;但是随着树变得越来越大,每次垃圾收集都会出现某种形式的暂停。

所以我想,也许如果我减少调用 gc 的次数呢?于是我将我的代码修改为:

    //garbage collection
    if (state.children.isEmpty()) {//if this is a leaf node (no children)
        state.parent.children.remove(state);
        if(index % 10000)
            System.gc();
    }

但实际上这似乎并没有进行任何清理,我的程序仍然会抛出 outOfMemory 异常。

我应该如何正确实现垃圾收集器,以避免调用过多次?

admin 更改状态以发布 2023年5月24日
0
0 Comments

暂停可能是垃圾回收发生的。正如Frederik所提到的那样,你确定需要手动调用垃圾回收吗?一般来说,你不需要这样做。如果你担心内存使用,可以更频繁地剪枝,但是让垃圾回收自己决定何时运行,不要手动调用。

你提到第二段代码崩溃导致OutOfMemoryExceptions,所以你可能还有其他的问题,你可能需要展示更多的代码。

0
0 Comments

通常情况下,您不需要显式调用垃圾回收器。偶尔需要这样做,但是如果您发现需要使用它,我通常会感到怀疑。

您是否尝试打开了详细的GC日志记录? 虽然一开始可能有些棘手,但它应该会显示您正在发生什么事情。我不会惊讶地发现实际上您有某个存储泄漏,只是通过每次循环运行GC,您已经将程序减慢到无法达到崩溃点。

您为VM分配了多少内存?调整内存设置(以及GC设置)可能对某些工作负载产生重大影响。

0