35

我在 logcat 中收到此消息在 附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。在哪里查找泄漏以及“请参阅 java.io.Closeable”是什么意思

4

7 回答 7

14

这意味着您打开了某些东西,但从未关闭它们。Closable有一个方法close,当你不再需要它时,你必须调用它来释放与组件关联的资源。

要查找泄漏,您可以尝试MAT,我经常使用它来查找内存泄漏(包含对 Activity 的引用的静态数据等)。

于 2014-08-28T08:26:04.307 回答
7

对我来说,问题发生是因为我在onBackPressed()没有调用的情况下覆盖了该方法super()

@Override
public void onBackPressed() {
    //some coding here
    super.onBackPressed();
}
于 2015-06-26T08:24:37.837 回答
5

如果你看到类似的东西:

10-12 16:46:44.719 2710-2719/? E/StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
10-12 16:46:44.719 2710-2719/? E/StrictMode: java.lang.Throwable: Explicit termination method 'end' not called
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at dalvik.system.CloseGuard.open(CloseGuard.java:184)
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at java.util.zip.Inflater.<init>(Inflater.java:82)
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at com.android.okio.GzipSource.<init>(GzipSource.java:57)
10-12 16:46:44.719 2710-2719/? E/StrictMode:     at com.android.okhttp.internal.http.HttpEngine.initContentStream(HttpEngine.java:490)

在您的堆栈跟踪中,旧版本的 okhttp 中有一个已知错误,您可以通过在 gradle 文件中强制使用新版本来避免该错误。

编译'com.squareup.okhttp3:okhttp:3.2.0'

至少为我解决了一个非常相似的问题。

于 2016-05-02T09:45:09.257 回答
3

出现问题时也会显示相同的错误消息AndroidManifest.xml。对我来说,<activity>标签不小心掉了<application>

这是对的:

<application ... >
    ...
    <activity ... />
</application>

这将导致在启动活动时“在附加的堆栈跟踪中获取了资源但从未释放” :

<application ... >
    ...
</application>

<activity ... />
于 2015-02-16T10:00:16.070 回答
0

当我没有在 Application.mk 中声明第二个活动时,我在从另一个活动启动第二个活动时发生了这种情况。

于 2015-06-21T13:44:27.403 回答
0

对我来说,这似乎与模拟器有关,因为它通过更改为另一个模拟器而消失了。您可以在真实设备上进行测试。

于 2021-07-21T03:55:37.617 回答
-4

我的错误是由启用严格模式引起的。当我使用 adb 在测试手机上进行重新部署时,一些资源没有正确关闭。

我通过从严格模式中删除 deathPenalty 来“修复”该错误:

            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectAll()
                    .penaltyLog()
//                    .penaltyDeath()
                    .build());
于 2017-02-03T07:11:52.047 回答