匿名の内部クラスはメモリ リークを引き起こす可能性があります。問題は、匿名の内部クラスが外部クラスへの参照を保持するため、外部クラスがガベージ コレクションされなくなることです。解決策には次のものが含まれます。 1. 弱参照を使用します。外部クラスが強参照によって保持されなくなった場合、ガベージ コレクターは弱い参照オブジェクトをすぐにリサイクルします。ガベージ コレクション中にメモリが必要になるため、ソフト参照オブジェクトがリサイクルされます。実際には、Android アプリケーションなどで、匿名内部クラスによって引き起こされるメモリ リークの問題は、弱い参照を使用することで解決できるため、リスナーが必要ないときに匿名内部クラスをリサイクルできます。
Java 匿名内部クラス: メモリ リークを解決する方法
はじめに
匿名内部クラスは、それを作成するクラスまたはメソッドに直接記述された名前のない内部クラスです。匿名内部クラスはコードを簡素化できますが、適切に管理しないとメモリ リークが発生する可能性があります。
メモリ リークの生成
メモリ リークは、匿名の内部クラスがその外部クラスへの参照を保持しているときに発生します。外部クラスはガベージ コレクションを防止し、内部クラスは不要になった場合でもメモリ内に残ります。
解決策
匿名内部クラスのメモリ リーク問題は、 弱い参照 または ソフト参照 を使用して解決できます。これらの参照により、ガベージ コレクターは必要に応じてオブジェクトを再利用できるようになりますが、まだオブジェクトが再利用されていない場合はオブジェクトへのアクセスも許可されます。
弱い参照を使用する
弱い参照は、最も弱い参照の種類です。オブジェクトが強参照によって保持されなくなった場合、ガベージ コレクターは弱い参照を保持しているオブジェクトを直ちに再利用します。
public class Example { private static class InnerClass { // ... } public static void main(String[] args) { // 创建外部类对象 Example example = new Example(); // 创建持有外部类引用的匿名内部类 Runnable runnable = new Runnable() { @Override public void run() { // ... } }; // 将匿名内部类弱引用 WeakReference<Runnable> weakRunnable = new WeakReference<>(runnable); // ... // 显式取消强引用 runnable = null; // 垃圾回收器将回收匿名内部类,因为只有弱引用持有其引用 } }
ソフト参照を使用する
ソフト参照は、弱い参照よりも強力です。ガベージ コレクターは、ガベージ コレクションの実行中にメモリが必要な場合にのみ、ソフト参照を保持するオブジェクトを再利用します。
public class Example { private static class InnerClass { // ... } public static void main(String[] args) { // 创建外部类对象 Example example = new Example(); // 创建持有外部类引用的匿名内部类 Runnable runnable = new Runnable() { @Override public void run() { // ... } }; // 将匿名内部类软引用 SoftReference<Runnable> softRunnable = new SoftReference<>(runnable); // ... // 显式取消强引用 runnable = null; // 垃圾回收器可能会在需要内存时回收匿名内部类,但只有当内存不足时才会回收 } }
実用的なケース
次に、Android アプリケーションの匿名内部クラスによって引き起こされるメモリ リークを解決するための実際的なケースを示します。弱い参照 。リスナーが必要ないときに匿名内部クラスが確実にガベージ コレクションされるようにすることで、メモリ リークを防ぎます。
以上がJava の匿名内部クラスはメモリ リークの問題をどのように解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。