当使用Kotlin :: class.java.canonicalName时OutOfMemoryexception

运行这行代码时,出现Out Of Memoryexception

private val TAG = KotlinFilePicker()::class.java.canonicalName 

并禁用时,它工作正常

 Throwing OutOfMemoryError "Failed to allocate a 170 byte allocation with 68 free bytes and 68B until OOM" (recursive case) 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: "main" prio=5 tid=1 Runnable 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: | group="main" sCount=0 dsCount=0 obj=0x7581c250 self=0xb4f07800 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: | sysTid=20584 nice=-11 cgrp=apps sched=0/0 handle=0xb6fd7ec8 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: | state=R schedstat=( 0 0 0 ) utm=1394 stm=35 core=1 HZ=100 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: | stack=0xbe57a000-0xbe57c000 stackSize=8MB 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: | held mutexes= "mutator lock"(shared held) 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: at android.support.v4.app.FragmentHostCallback.(FragmentHostCallback.java:46) 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: at android.support.v4.app.FragmentHostCallback.(FragmentHostCallback.java:63) 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: at android.support.v4.app.FragmentActivity$HostCallbacks.(FragmentActivity.java:871) 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: at android.support.v4.app.FragmentActivity.(FragmentActivity.java:100) 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: at android.support.v7.app.AppCompatActivity.(AppCompatActivity.java:61) 01-04 00:14:55.044 20584-20584/com.androidbuffer.kotlinfilepickersample E/art: at com.androidbuffer.kotlinfilepicker.KotlinFilePicker.(KotlinFilePicker.kt:19) 01-04 00:14:55.044 20584-20584/com.android 

有人能指出这样做有什么问题

不应该是

 private val TAG = KotlinFilePicker::class.java.canonicalName 

代替?

由于你的堆栈跟踪状态如下:

 Failed to allocate a 170 byte allocation with 68 free bytes and 68B until OOM" (recursive case) 

这意味着我们在这里有一个无限的递归。 仔细看看代码,我们看到你创建了一个类的实例,它试图创建TAG属性,这又创建了KotlinFilePicker另一个实例…直到所有的内存耗尽。

你正在创建一个新的KotlinFilePicker() ,它有自己的TAG,它创建一个新的KotlinFilePicker()

修复它使用KotlinFilePicker::class.java.canonicalName