【发布时间】:2021-06-03 15:45:03
【问题描述】:
我正在学习 Java 和所有不同世代的垃圾收集。我现在知道,当一个对象在运行后没有被标记时,它就会被清扫。不过我很好奇:这个全面的过程到底是什么?
我的理解是它从堆中删除死对象,并且堆存储在 RAM 中,但是删除究竟是如何工作的?操作系统是否公开了从 RAM 中删除特定块的数据的方法?
我猜它的作用相当于 C 中的 free() 函数的作用,所以我想这是一个关于该函数究竟做了什么的问题。
【问题讨论】:
-
没有必要按照你建议的方式“删除”它; JVM 只是将该空间标记为可用于稍后写入。
-
谢谢,这是有道理的。那么我的下一个问题是 JVM 如何找到下一个可用空间?它是否保留了所有可用空间的地图,或者 GC 的压缩部分是否意味着它可以知道可用空间从哪里开始?
-
它有一个内部分配系统,执行与
malloc/free相同的职责。 JVM 实现之间的细节有所不同。 -
一个常见的实现是将保留的对象移动到一个新空间,因此用于新对象分配的所有空间变得空闲,无需跟踪任何特殊内容。这是generational GC strategy。
标签: java memory-management garbage-collection