若何制止 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仄台此外相闭文章!
发表评论 取消回复