Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在这种情况下,内存泄漏是如何发生的?_Android_Kotlin - Fatal编程技术网

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框架的内部构件,用于创建处理点击的对象(至少您需要分配一个点击/触摸事件对象)。