1 一个小例子
首先,来看一个小例子。新创建一个Android工程项目,在Activity里面增加两个按钮,一个按钮用于产生内存泄漏,一个按钮用于对比将会把对象释放:
android:layout_width="match_parent"
android:layout_height="48dp"
android:onClick="makeLeak"
android:text="内存泄露" />
android:layout_width="match_parent"
android:layout_height="48dp"
android:onClick="makeRelease"
android:text="及时释放" />
创建一个类LeakTest,用于该例子的相关测试业务,这里先省略相关方法的具体实现:
object LeakTest {
// 制造内存泄露
fun makeLeak(activity: Activity) {
...
}
// 及时释放对象
fun makeRelease(activityRef: WeakReference) {
...
}
// 执行垃圾回收
fun gc() {
...
}
}
对应的MainActivity代码如下:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun makeLeak(view: View) {
LeakTest.makeLeak(this)
finish()
}
fun makeRelease(view: View) {
LeakTest.makeRelease(WeakReference(this))
finish()
}
override fun onDestroy() {
super.onDestroy()
Log.i(LOG_CAT, "onDestroy: ")
LeakTest.gc()
}
}
从例子中可以看出,无论我们点击“内存泄露”还是“及时释放”按钮,都会调用finish,随之在MainActivity的onDestroy后面会执行垃圾回收,在垃圾回收之后&#