当前位置: 首页 > 知识库问答 >
问题:

在Android中创建Observable from Where子句时可能存在领域内存泄漏

皇甫树
2023-03-14

也许我不知道如何正确地将领域与可观察对象一起使用,但当我从一个领域创建一个可观察对象并订阅它时,我似乎遇到了领域内存泄漏。我在onDestroy()中关闭领域,并在onPause()中取消订阅可观察的领域。但是,如果我添加并返回以下片段几次(它被添加到backbackback,并在背压时删除):

public class RealmFragment extends android.support.v4.app.Fragment {

    private Realm mRealm;
    private Subscription mSubscription;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_realm, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mRealm = Realm.getDefaultInstance();

        mSubscription = mRealm.where(Person.class)
            .findAllAsync()
            .asObservable()
            .subscribe(new Action1<RealmResults<Person>>() {
                @Override
                public void call(RealmResults<Person> persons) {
                    Log.d("RXREALM", "OnNext called");
                }
            });
    }

    @Override
    public void onPause() {
        super.onPause();
        mSubscription.unsubscribe();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mRealm.close();
    }
}

我注意到,如果我在Android studio中进行几次GC,然后进行堆转储,则会有多个Realm和RealmResult实例,其数量等于我启动片段的次数。我在任何地方都没有提到他们。在我最后一次离开RealmFragment之后,没有提到它。

我注意到,如果我不取消订阅哪里订阅,领域对象的数量不会增加。领域结果的数量仍然在增加。

我做了一个空项目来测试这个。RxJava和Realm是最新的。请澄清为什么会发生这种情况,或者Realm如何管理可观察对象。在我调查问题时,可以在此处找到整个空项目:https://github.com/willjgriff/android-realm-leak

共有1个答案

郤玉书
2023-03-14

用于生成可观察对象的领域代码如下:https://github.com/realm/realm-java/blob/master/realm/realm-library/src/main/java/io/realm/rx/RealmObservableFactory.java

只要你不退订一个可观察的,领域就会保留一个对它的强引用,但当你退订时,它应该释放这个引用。

但是如果没有关于代码的更多上下文,就很难确切地说出发生了什么。你能举一个完整的例子吗。

 类似资料:
  • 我正在启用持久性的Kubernetes集群中运行Ignite。每台机器都有一个24GB的Java堆,20GB专用于持久内存,内存限制为110GB。我的相关JVM选项是。在每个节点上运行DataStreamer数小时后,我的集群上的节点达到了它们的k8s内存限制,触发了OOM杀机。运行Java NMT后,我惊讶地发现分配给内部内存的空间数量巨大。 Kubernetes metrics证实了这一点:

  • 我试图将Ignite用作键值对的内存数据库,其值范围从50MB到800MB不等。看起来Ignite通过JVM分配堆空间,它从不清理,即使缓存条目离开堆,被清除,没有连接的客户机和运行的操作。我的机器将无法处理这样的内存消耗,因此我正在寻找一种方法来清理一些内存。 我的测试场景如下: null 我正在使用pyignite瘦客户机,通过python脚本在本地测试Ignite: 该脚本将800 MB的数

  • 我正在编写一个spring boot 2应用程序,我正在使用SQL批量复制功能在SQL Server2012数据库中插入几条记录。每插入700行,我就有600 MB的泄漏 我已经试用了Microsoft驱动程序版本6.4.0.jre8和7.2.2.jre8,但任何东西都改变了。我尝试为tomcat更改Hikari连接池,但结果是一样的。 为了调用Microsoft API,我使用了包装器框架(ht

  • 问题内容: 我刚刚接受采访,并被要求使用Java 造成内存泄漏。 不用说,我对如何开始创建它一无所知。 一个例子是什么? 问题答案: 这是在纯Java中创建真正的内存泄漏(运行代码无法访问但仍存储在内存中的对象)的好方法: 该应用程序将创建一个长期运行的线程(或使用线程池更快地泄漏)。 线程通过(可选,自定义)加载类。 该类分配大量的内存(例如),在静态字段中存储对它的强引用,然后在中存储对自身的

  • 问题内容: 我启动oracle时遇到此错误。我检查了Oracle Home和SID。一切设置正确。 ORA-27101:共享内存领域不存在 请帮助我找出解决方案。提前致谢 问题答案: 该错误通常表示没有Oracle实例(进程)可连接。有人需要登录并启动实例。

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是