我知道Java会在堆中分配对象以及原因。我知道原始数据类型和引用变量是在Stack结构上分配的。
我不明白的是它的效率。与其他人相比,它似乎工作得非常快。
我的问题彼此相关:是什么让Java的Heap结构高效?它是如何实现的?
答案 0 :(得分:3)
HotSpot JVM使用不同垃圾收集器的集合相互串联以提高效率。由于大多数对象的生命周期都非常短,因此它使用小型的停止和复制垃圾收集器进行大多数分配。由于停止和复制允许几乎即时的分配(通常是一个或两个汇编指令),这使得大多数分配都很快。执行“复制”步骤的成本很低,因为大多数对象都被回收,并且为复制收集器保留的小尺寸为复制所花费的最长时间提供了良好的上限。
对于在停止和复制收集器的第一层中长时间存活的对象,HotSpot具有第二级别的停止和复制内存,用于重定位这些对象。这可以在顶级复制收集器中释放更多空间。存活时间足够长的对象然后移动到使用标记和扫描集合的区域。这个想法是,任何在那里结束的事情很可能会持续很长一段时间,因为它存活了很长时间。
这种混合方法 - 加上一堆其他优化 - 解释了为什么分配和解除分配如此之快。请注意,由于暴露的指针,这里使用的关键技巧 - 即重定位对象 - 很难在低级语言中实现。