【发布时间】:2020-03-29 19:23:39
【问题描述】:
出于学习目的,我目前正在试验垃圾收集(Pixel 2,Android 10 -> ART)。我对以下实验的观察是,CountActivity 在第一次显式垃圾收集运行时永远不会被删除,而只会在第二次显式垃圾收集运行时被删除。我想了解为什么它在第一次运行时没有被删除。我认为这是由于某种分代垃圾收集,但我想验证它。我如何“观察”垃圾收集的作用?例如。是否可以看到垃圾收集对堆进行分组的内部代?
我的测试示例如下:
-
MainActivity,显示一个按钮“显示 CountActivity” -
CountActivity当按下MainActivity中的“显示计数活动”按钮时显示。 - 我使用系统返回键结束
CountActivity
在此之后,我强制运行显式垃圾回收,捕获一个堆。 CountActivity还在。在强制运行第二次显式垃圾回收并再次捕获堆后,CountActivity 消失了。现在我仍然想了解为什么需要运行两次垃圾回收。
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
buttonStart.setOnClickListener {
showCountActivity()
}
}
private fun showCountActivity() {
val intent = Intent(this, CountActivity::class.java)
startActivity(intent)
}
}
CountActivity
class CountActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_count)
}
}
【问题讨论】:
-
能否分享您的 GC 日志文件,以便我们了解实际发生的情况?
-
当然。你能给我一些提示如何收集这些吗?猜你不只是在谈论 logcat 条目,对吧?
-
当你已经有一个堆转储时,你应该能够找出对对象的哪些引用确实存在。
-
我没有理由假设堆转储是相同的。事实上,你已经说过它们不是,因为至少在所讨论对象的存在方面存在差异。当第一次转储中没有对它的引用时,我们不仅涉及垃圾收集器的工作方式,还涉及堆转储的创建方式。除了能够看到堆转储中的对象之外,还有其他后果吗?
-
@Holger 不,没有其他后果。它存在于第一个堆转储中,然后在第二个中消失,中间没有任何操作。
标签: android garbage-collection