我找到一张表格,显示Android OS中不同类型GC的功能。 我想知道表中的保存意味着什么。 表格如下:
GC_FOR_ [M] ALLOC
部分:Y并发:N保留:Y
触发时:没有足够的空间来分配“普通”对象。
GC_CONCURRENT
部分:Y并发:Y保留:Y
触发时:超过堆占用阈值触发自动GC。
GC_EXPLICT
部分:N并发:Y保留:Y
触发时:通过Runtime.gc(),VMRuntime.gc()或SIGUSR1显式GC
GC_BEFORE_OOM
部分:N并发:N保留:N
何时被触发:在投掷OOM之前最终尝试回收内存。
答案 0 :(得分:0)
嗯,“保留”标题旁边有一个星号,表格下面的相应注释表示
保留可轻松到达的对象
指的是SoftReferences是否被清除。 Java VM尝试将SoftReferences引用的对象保留在内存中,但如果垃圾收集器需要其他对象的空间,它可能会收集它们(当然,如果它们不是很容易访问的话)。有关SoftReferences的更多信息,请阅读[soft-references]标记wiki或尝试搜索[java][soft-references]
。
在这种情况下,前三种集合类型是“正常”,JVM不会清除SoftReferences。最后一种情况是最后一次尝试回收内存以避免抛出OutOfMemoryError,并且JVM将清除SoftReferences以便它可以收集更多对象。 (在按规范抛出OOME之前,SoftReferences是 required 要清除。)请注意,SoftReference策略因JVM和GC算法而异,因此其他VM可能会清除“旧”SoftReferences(对于某些“旧”的含义) )在正常收藏期间。