我想知道是否有任何热点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()时无法收集范围
答案 0 :(得分:5)
当然可以; Java规范并未禁止它。它只是将垃圾收集问题完全留给了实现。 JVM实际上根本不需要实现垃圾收集!
原因很简单,JVM可以使用许多技术,这些技术在概率上比您所讨论的同步分配更有效,例如分代堆和并发标记和扫描。您可以自由地实现您在自己的VM中讨论的那种逻辑,但是分析表明,对于许多业务类型的工作负载,C ++程序中的大部分CPU使用率都被构造和破坏所占用。对象和像世代堆这样的方法简化了很多内存管理。
答案 1 :(得分:4)
你所谈论的并不是确定性而是渴望垃圾收集,如果JVM真的对你这么做,你会后悔自己的愿望。 Eager GC在解除分配和分配方面效率都很低:它迫使运行时以过于精细的方式处理内存,从而排除了许多优化机会并导致堆碎片化。
如果您真正关心性能,那么您希望批量完成GC,这正是HotSpot所做的。
答案 2 :(得分:0)
几年前我记得JRockit实时JDK的推出。 不确定它是否与当前规格保持同步。