我想使用堆栈作为我的堆管理系统(在其他世界中,我想使用堆栈而不是堆)来分配和释放对象。我知道分配速度非常快,可以通过增加堆栈指针来模拟。但我的问题是,当我使用像标记和扫描这样的垃圾收集算法时,如何在扫描阶段释放对象? 由于堆栈是LIFO,堆栈中的最后一个对象可能是活的,并且它下面的对象可以被释放!那么我怎样才能进行扫描阶段?(因为堆栈中的最后一个对象是活着的而没有弹出它,所以不可能释放下面的对象) 还有我如何处理堆栈中的碎片?
答案 0 :(得分:1)
我想将堆栈用作我的堆管理系统
在Java 1 中无法实现。
但我的问题是,当我使用像标记和扫描这样的垃圾收集算法时,如何在扫描阶段释放对象?
这是非常假设的,因为你无法在Java 2 中执行此操作,但如果要在堆上存储对象,那么它们永远不会是垃圾收集器需要处理的垃圾。 (事实上,将它们放在堆上的重点是避免 GC必须处理它们。)
1 - ...除了在使用JNI调用本机方法的边缘情况下,本机方法在方法调用期间执行。在Java的一些最新版本中,JIT编译器能够发现一些对象可以在堆栈上安全地分配的情况......并且这样做。但这是透明的。 JIT编译器做到了......不是你。
2 - 设计和实现既垃圾收集的编程语言也不是不可能的,和它允许您在堆上进行分配。但是,使实现类型安全会很困难。语言设计需要一种方法来防止指向堆栈对象的指针存储在堆对象中。而且我认为这会使语言变得复杂,难以理解。 IMO,这不值得。
答案 1 :(得分:0)
实际上,当在转义分析之后,已知已分配的对象不在当前方法之外使用时,Java将在堆栈上进行分配。
答案 2 :(得分:0)
这是堆与堆栈的关系。堆叠支撑孔,堆叠不支持孔。您可以轻松地使用堆栈,只需一个指向" end"堆,快速递增它以分配新对象,但是你在清理时遇到同样的问题 - 如何获得空间。
除非可以保证以完全相反的分配顺序释放对象,否则堆栈将很难用作堆。