当前位置: 首页 > 面试题库 >

使用WeakReferences有什么好处?

端木渝
2023-03-14
问题内容

我的应用程序中有一些内存泄漏。它们都起源于一个特定的视图集群,我花了大量时间进行调整,并尝试减少尽可能多的上下文传递。这使我相信群集中使用的位图就是问题所在。因此,我考虑将WeakReferences用于所有对视图使用的位图的引用。我从未使用过WeakReference,并且不确定这是否是一个好的应用程序。任何机构都可以提供有用的指示或技巧吗?


问题答案:

因此,我考虑将WeakReferences用于所有对视图使用的位图的引用。我从未使用过WeakReference,并且不确定这是否是一个好的应用程序。任何机构都可以提供有用的指示或技巧吗?

小心,这对您来说很危险。GC可能会删除您的所有位图,而您的应用程序可能仍需要它们。

关于WeakReference的关键问题是了解硬引用之间的区别。如果您的应用程序中不再有对位图的硬引用,则允许GC从内存中原子删除该对象,并且所有现有的弱引用将立即指向null。就您而言,您不能在整个代码中使用弱引用。

这是解决方案的想法。创建一个容器对象,该容器对象将(仅)保留对所有位图的弱引用。您的视图应始终仅引用带有硬引用的位图。视图创建位图时,应将其注册到容器对象中。当要使用视图时,应从容器中获取硬引用。

这样,如果没有视图引用位图,则GC将收集对象而不会产生视图副作用,因为没有人对其进行硬引用。使用弱引用的对象时,优良作法是在不再需要该对象时将硬引用显式设置为null。

加成

这是解决方案的快速实现(仅是提供一个想法):

public class BitmapContainer {

    public static class Bitmap {
        private final long id;
        public Bitmap(long id) { this.id = id; }
        public long getId() { return id; }
        public void draw() { };
    }

    WeakHashMap<Bitmap, WeakReference<Bitmap>> myBitmaps
        = new WeakHashMap<Bitmap, WeakReference<Bitmap>>();

    public void registerBitMap(Bitmap bm) {

        if ( bm == null ) throw new NullPointerException();

        WeakReference<Bitmap> wr = new WeakReference<Bitmap>(bm);
        myBitmaps.put(bm, wr);

    }

    /** Method returns null if bitmap not available */
    public Bitmap getBitMap(long id) {

        for ( Bitmap item : myBitmaps.keySet() ) {
            if ( item != null) {
                if ( item.getId() == id ) {
                    return item;
                }
            }
        }

        return null;

    }

}


 类似资料:
  • 本文向大家介绍使用黄瓜有什么好处?,包括了使用黄瓜有什么好处?的使用技巧和注意事项,需要的朋友参考一下 下面列出了使用黄瓜的一些优点- Cucumber是一种开源工具,不需要许可。 黄瓜可以通过Eclipse等IDE轻松配置。 黄瓜弥合了开发人员,测试人员,业务分析师,客户和产品所有者之间的理解和沟通差距。 黄瓜使没有技术知识的业务利益相关者参与其中。 黄瓜提供纯文本表示形式,使团队中的非技术人员

  • 问题内容: 我看到人们正在运行Nginx + Gunicorn + Flask之类的设置。 谁能解释在flask前使用Gunicorn有什么好处?为什么不只运行Flask?运行Gunicorn + Flask会消耗更多资源吗?Gunicorn无法响应时,可以重启Flask实例吗? 将nginx放在gunicorn上还有什么目的? 问题答案: 我认为你可能会感到困惑,Flask不是Web服务器,它是

  • 问题内容: 我是Java开发人员,我想知道如何在Java程序中使用Scala? 问题答案: 去阅读 Daniel Spiewak 关于Scala 的优秀博客系列。使用Scala,您可以保持: 您所有的Java库 在JVM上运行的所有优势(普遍性,管理工具,性能分析,垃圾回收等) 但是您可以编写Scala代码: 比Java更简洁明了(尤其是使用更多的 功能 样式,例如在collections库中)

  • 问题内容: 我刚开始,最近经历了一个ODM框架。 在文档上,我找不到为什么需要使用。我可以给出的一个原因是,我们可以从定义应用程序架构。 我正在寻找更多可能的原因,以及吸引我使用的需求。 请列出所有可能的优点和使用理由/需要。 问题答案: 主要优势是相对于纯mongo的抽象。 来自SQL数据库类型的许多开发人员对于使用未定义结构的动态集合感到非常不舒服。因此, 模式 首先可以帮助您。 此外,它实现

  • 本文向大家介绍使用区块链技术有什么好处?相关面试题,主要包含被问及使用区块链技术有什么好处?时的应答技巧和注意事项,需要的朋友参考一下 回答:使用区块链技术的主要好处如下: 增强安全性 改进的可追溯性 节约成本 用户假名 不变性 交易的透明度 自动对帐 欺诈控制 中介服务不付款

  • 问题内容: 这个问题已经在这里有了答案 : 服务Flask应用程序是否需要WSGI服务器和HTTP服务器? (2个答案) 去年关闭。 我看到人们正在运行Nginx + Gunicorn + Flask之类的设置。 有人可以解释在烧瓶前使用Gunicorn有什么好处吗?为什么不只运行Flask?运行Gunicorn + Flask不会消耗更多资源吗?Gunicorn无法响应时可以重启Flask实例吗