我正在运行一个带有垃圾收集代码段的调度算法,如下所示:
//garbage collection
if (state.children.isEmpty()) {//if this is a leaf node (no children)
state.parent.children.remove(state);
System.gc();
}
首先,算法运行平稳,没有暂停;但随着树木开始变大,一段时间后,每个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异常。
我应该如何正确实现我的垃圾收集器,以免被调用太多次?
答案 0 :(得分:3)
您根本不需要显式调用垃圾收集器。 偶尔是合适的,但如果您发现需要它,我通常会非常怀疑。
您是否尝试过运行详细的GC日志记录?一开始理解起来可能很尴尬,但它应该告诉你发生了什么。我不会惊讶地发现,实际上你在某个地方遇到了泄漏,而且只是通过GC-ing在每次迭代时,你已经放慢了你的程序,所以你还没有到达咬人。
您为VM分配了多少内存?调整内存设置(实际上是GC设置)会对某些工作负载产生很大影响。
答案 1 :(得分:2)
暂停可能是垃圾收集正在发生。正如Frederik所提到的,您确定必须手动调用GC吗?通常你不应该这样做。如果您担心内存使用情况,可以更频繁地修剪树,但让GC处理何时运行,不要手动调用它。
你提到你的第二个片段导致OutOfMemoryExceptions,所以也许你还有其他一些问题,你可能想要显示更多的代码。