Android 在这种情况下,内存泄漏是如何发生的?
我无法理解内存泄漏是如何在我的应用程序中发生的。我有一个简单的代码,它复制了错误,如下所示: 在Android 在这种情况下,内存泄漏是如何发生的?,android,kotlin,Android,Kotlin,我无法理解内存泄漏是如何在我的应用程序中发生的。我有一个简单的代码,它复制了错误,如下所示: 在main活动中。我创建了一个日历实例,并在TextView中更新了毫秒 private lateinit var calendar: Calendar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activ
main活动中
。我创建了一个日历实例,并在TextView中更新了毫秒
private lateinit var calendar: Calendar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Example of a call to a native method
sample_text.text = stringFromJNI()
statBtn.setOnClickListener{
calendar = GregorianCalendar.getInstance()
sample_text.text = calendar.timeInMillis.toString()
}
}
当我运行应用程序时,只需按下statBtn
应用程序工作正常(我在文本视图中看到时间更新)。然而,logcat报告如下
I/zygote64: Do partial code cache collection, code=24KB, data=26KB
I/zygote64: After code cache collection, code=24KB, data=26KB
I/zygote64: Increasing code cache capacity to 128KB
I/zygote64: Do partial code cache collection, code=57KB, data=54KB
I/zygote64: After code cache collection, code=57KB, data=54KB
I/zygote64: Increasing code cache capacity to 256KB
编辑
此代码也会泄漏:
package com.example.blabla.d344
import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
class MainActivity : AppCompatActivity() {
private val TAG = "Main Activity"
//private lateinit var task: LongTask
private var idx=0
private lateinit var calendar: Calendar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Example of a call to a native method
sample_text.text = stringFromJNI()
calendar = GregorianCalendar.getInstance()
statBtn.setOnClickListener{
//sample_text.text = calendar.timeInMillis.toString()
}
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
external fun stringFromJNI(): String
companion object {
// Used to load the 'native-lib' library on application startup.
init {
System.loadLibrary("native-lib")
}
}
}
为什么每次按下按钮时都要声明一个新的
GregorianCalendar
实例getInstance()
不是单例,这可能解释了在GC发生之前内存使用增加的原因。@MichaelDodd如果我将GregorianCalendar
的创建移到OnClickListener
之外,时间将不再更新。问题仍然存在,代码缓存仍然在增加。还有,为什么GC不够智能?内存转储可能会更有帮助。控制台消息看起来不像是内存泄漏,这可能是应用程序执行的正常方式,远远超出了活动类代码。GC通常是惰性的,它可能不会立即收集内存。相反,当内存足够时,它可能会等待一段时间。因此,您可能会看到尚未收集的不需要的对象。内存转储将有助于查看它。它可能是Android框架的内部构件,用于创建处理点击的对象(至少您需要分配一个点击/触摸事件对象)。