3

我想知道是否存在热点 JVM 或任何其他 JVM 可以确定性地进行垃圾收集的任何实例。我知道逃逸分析,但想知道它是否也适用于堆分配的对象。我的意思是在这样的 C++ 代码中,可以从堆中进行确定性垃圾收集

#include <vector>
int main(int argc, char*argv[]){
    std::vector<double> v_somevector;
} // std::vector::~vector() is called determinitically

当然在Java中类似

.
.
.
private double ma() throws Exception{
    double result = 0.0;
    final double[] closes = new double[100000];
    //perform some calculation using the closes array above
    return result;
} // At this point why shouldn't closes be deterministically garbage collected (as in immediately)?

在垃圾收集关闭数组时应该是确定性的。看起来,逃逸分析似乎专注于在堆栈上分配关闭数组的可能性,但即使在堆上分配,在这种情况下,我不明白为什么在离开 ma()' 时无法收集它范围

4

3 回答 3

5

当然可以;Java 规范并没有禁止它。它只是将垃圾收集的问题完全留给了实现。JVM 甚至根本不需要实现垃圾收集!

原因很简单,JVM 可以使用许多技术,这些技术在概率上比您所说的同步分配更有效,例如分代堆和并发标记和清除。您可以自由地在自己的 VM 中实现您所说的那种逻辑,但分析表明,对于许多业务类型的工作负载,C++ 程序中的大部分 CPU 使用率都被构造和销毁占用了对象,以及像分代堆这样的方法简化了很多内存管理。

于 2013-12-02T13:28:31.240 回答
4

您所说的与其说是确定性不如说是急切的垃圾收集,如果 JVM 真的对待您,您会后悔自己的愿望。Eager GC 在解除分配和分配方面都是低效的:它迫使运行时以过于细化的方式处理内存,排除了许多优化机会并导致堆碎片。

如果你真的关心性能,那么你希望你的 GC-ing 批量完成,而这正是 HotSpot 所做的。

于 2013-12-02T14:00:02.487 回答
0

我记得几年前引入了 JRockit Real Time JDK。不确定它是否符合当前规格。

PDF 演示文稿

于 2013-12-02T13:48:07.597 回答