java W/System:资源未能调用释放

qncylg1j  于 2022-12-28  发布在  Java
关注(0)|答案(5)|浏览(145)

在我的应用上使用AndroidStudio的控制台时,它显示:
W/System:资源调用释放失败。
有时候它被说了很多次,我知道它的意思,但是我已经检查了几乎2k行的代码很多次,但是我不知道我错过了什么关闭/释放。

**是否有任何方法可以从控制台扩展此信息?**或者您将如何确定资源是什么或何时无法关闭?欢迎提出任何建议。谢谢。

czq61nw1

czq61nw11#

来自@guest的答案是有效的,但是您可以使用Strict Mode在不诉诸反射的情况下实现完全相同的结果。

StrictMode.setVmPolicy(new VmPolicy.Builder()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .build());

一般来说,严格模式可以为您做更多的事情(见上面的链接),所有您需要做的默认设置是:

StrictMode.enableDefaults();  # <-- This includes warning on leaked closeables

要“尽快”启用严格模式,您可以将上述任一代码选项添加到应用程序类的构造函数中,例如:

public class MyApp extends Application {

    public MyApp() {
        if(BuildConfig.DEBUG)
            StrictMode.enableDefaults();
    }

}

请注意,除了创建上述类之外,您还需要告诉Android您已在AndroidManifest.xml中创建了一个自定义应用程序类(以便在应用程序进程启动时创建它的示例,而不是Android创建默认的Application类)。您需要添加/修改<application>标记的android:name属性,使其指向自定义应用程序类的完全解析包路径(本例中为MyApp):

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name="com.example.app.MyApp"  <-- IMPORTANT PART: ADAPT FOR YOUR ACTUAL PROJECT
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
j91ykkif

j91ykkif2#

这个消息来自dalvik.system.CloseGuard,在调试的时候,你可以设置它在你创建资源的时候创建堆栈跟踪,这样你就可以跟踪哪些对象没有被关闭。
它不是框架API的一部分,所以我使用反射来打开它:

try {
    Class.forName("dalvik.system.CloseGuard")
            .getMethod("setEnabled", boolean.class)
            .invoke(null, true);
} catch (ReflectiveOperationException e) {
    throw new RuntimeException(e);
}

更多信息:https://wh0.github.io/2020/08/12/closeguard.html

um6iljoc

um6iljoc3#

我不认为你能从Logcat得到更多的信息。
Android Profiler的内存视图可能是一个很好的起点。在使用应用时查看它可以给予你了解哪些操作会导致内存被分配而不是释放。你也可以从时间线中选择部分,并按类深入到特定的分配。
另外,LeakCanary是一个很好的检测内存泄漏的库。

5lhxktic

5lhxktic4#

迟回答,但可能对别人有用:
我遇到了同样的错误,但我忘记了我的VPN在后台运行。断开VPN对我来说是一个陷阱。也就是说,这可能是由于与您的应用程序或IDE无关的资源,您可能需要检查,如杀毒软件,VPN等。

qpgpyjmq

qpgpyjmq5#

通过删除通过另一个函数调用自身从而导致对自身调用无限循环的函数调用,修复了此问题

相关问题