堆栈上的堆分配(使用堆栈作为堆管理系统)

时间:2014-10-25 03:05:41

标签: java c++ garbage-collection stack heap-memory

我想使用堆栈作为我的堆管理系统(在其他世界中,我想使用堆栈而不是堆)来分配和释放对象。我知道分配速度非常快,可以通过增加堆栈指针来模拟。但我的问题是,当我使用像标记和扫描这样的垃圾收集算法时,如何在扫描阶段释放对象? 由于堆栈是LIFO,堆栈中的最后一个对象可能是活的,并且它下面的对象可以被释放!那么我怎样才能进行扫描阶段?(因为堆栈中的最后一个对象是活着的而没有弹出它,所以不可能释放下面的对象) 还有我如何处理堆栈中的碎片?

3 个答案:

答案 0 :(得分:1)

  

我想将堆栈用作我的堆管理系统

在Java 1 中无法实现。

  

但我的问题是,当我使用像标记和扫描这样的垃圾收集算法时,如何在扫描阶段释放对象?

这是非常假设的,因为你无法在Java 2 中执行此操作,但如果要在堆上存储对象,那么它们永远不会是垃圾收集器需要处理的垃圾。 (事实上​​,将它们放在堆上的重点是避免 GC必须处理它们。)


1 - ...除了在使用JNI调用本机方法的边缘情况下,本机方法在方法调用期间执行。在Java的一些最新版本中,JIT编译器能够发现一些对象可以在堆栈上安全地分配的情况......并且这样做。但这是透明的。 JIT编译器做到了......不是你。

2 - 设计和实现既垃圾收集的编程语言也不是不可能的,它允许您在堆上进行分配。但是,使实现类型安全会很困难。语言设计需要一种方法来防止指向堆栈对象的指针存储在堆对象中。而且我认为这会使语言变得复杂,难以理解。 IMO,这不值得。

答案 1 :(得分:0)

实际上,当在转义分析之后,已知已分配的对象不在当前方法之外使用时,Java将在堆栈上进行分配。

请参阅:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#escapeAnalysis

答案 2 :(得分:0)

这是堆与堆栈的关系。堆叠支撑孔,堆叠不支持孔。您可以轻松地使用堆栈,只需一个指向" end"堆,快速递增它以分配新对象,但是你在清理时遇到同样的问题 - 如何获得空间。

除非可以保证以完全相反的分配顺序释放对象,否则堆栈将很难用作堆。