JVM中的确定性垃圾收集

Mic*_*ael 3 java garbage-collection jvm escape-analysis

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

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

当然在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)?
Run Code Online (Sandbox Code Playgroud)

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

chr*_*ke- 5

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

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

  • @Michael请注意,同步,refcounted内存管理也可能导致突然延迟 - 例如,如果堆太碎片并且需要一些合并,或者如果您将ref发布到大型链表/二叉树,则会传递许多引用一次达到零. (2认同)