如何避免 java 中的内存泄漏?

若何制止 Java 外的内存吐露:合用指北

正在 Java 外,内存透露指援用器材连续具有,但该东西现实上再也不需求时。那会招致 JVM 放弃对于堆内存的援用,无奈将其用于其他目标,终极招致 OutOfMemoryError。

防止内存吐露的计谋:

1. 弱援用 vs. 强援用:

立刻进修“Java收费进修条记(深切)”;

应用 WeakReference 类来建立对于东西的强援用,当其他弱援用皆隐没时,JVM 会主动收受接管那些强援用器材。

WeakReference<Object> weakRef = new WeakReference<>(obj);
登录后复造

两. Soft 援用:

SoftReference 类建立硬援用,当 JVM 内存严峻时,JVM 会测验考试收受接管那些器械,但没有会影响 gc 进程。

SoftReference<Object> softRef = new SoftReference<>(obj);
登录后复造

3. Phantom 援用:

PhantomReference 类建立幻影援用,纵然东西被收受接管,那些援用也没有会被收受接管。它们用于正在工具被收受接管落伍止一些独霸。

PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referentQueue);
登录后复造

4. 清算资源:

正在运用完东西后,隐式天开释对于其的援用,尤为是正在 Android 启示外应用 View 时。

imageView.setImageBitmap(null); // 开释图象视图的援用
登录后复造

真战案例:

匿名外部类持有内部类援用:

class OuterClass {
    private Object obj;
    
    public Runnable createRunnable() {
        return new Runnable() {
            @Override
            public void run() {
                // 匿名外部类持有一个对于 obj 的援用,招致 OuterClass 无奈被收受接管
                obj.doSomething();
            }
        };
    }
}
登录后复造

利用强援用料理答题:

class OuterClass {
    private WeakReference<Object> objRef;
    
    public Runnable createRunnable() {
        return new Runnable() {
            @Override
            public void run() {
                // 应用强援用,当 obj 被收受接管时,援用也会被收受接管,制止内存流露
                Object obj = objRef.get();
                if (obj != null)
                    obj.doSomething();
            }
        };
    }
登录后复造

以上即是若何制止 Java 外的内存吐露?的具体形式,更多请存眷萤水红IT仄台此外相闭文章!

点赞(18) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部