有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JVM中的java确定性垃圾收集

我想知道是否有hotspot JVM或任何其他JVM可以确定地进行垃圾收集的实例。我知道escape分析,但不知道它是否也适用于堆分配的对象。我的意思是在C++代码中,例如,从堆

中给出确定性垃圾收集。
#include <vector>
int main(int argc, char*argv[]){
    std::vector<double> v_somevector;
} // std::vector::~vector() is called determinitically

肯定是在爪哇

.
.
.
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)?

在垃圾收集数组中应该是确定性的。从表面上看,escape分析似乎侧重于在堆栈上分配closes数组的可能性,但即使在堆上分配,在这种情况下,我不明白为什么不能在离开ma()的作用域时收集它


共 (1) 个答案

  1. # 1 楼答案

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

    原因很简单,JVM可以使用一些技术,这些技术可能比您所说的那种同步分配效率更高,比如分代堆和并发标记和扫描。你可以自由地在你自己的虚拟机中实现你所讨论的逻辑,但是剖析已经证明,对于许多商业类型的工作负载,C++程序中CPU使用的绝大部分是通过对象的构造和破坏来解决的,并且像代际堆这样的方法简化了大量的内存管理。p>