Java内存泄漏最常被忽视的是静态集合类、单例、非静态内部类及未关闭资源导致短命对象无法回收。需用WeakHashMap、WeakReference、try-with-resources等机制及时断开引用。
Java内存泄漏里,最常被忽视又最容易复现的,就是静态集合类和长生命周期对象“拖住”短命对象的问题。它不是JVM坏了,而是引用关系没及时断开,让GC以为这些对象还在用。
static HashMap、ArrayList 等一旦声明,就活到应用结束。往里面 put 或 add 的对象,哪怕业务逻辑早已不用,只要没手动 remove 或 clear,就会一直驻留。
单例、Application、全局事件总线等,生命周期和 App 一样长。一旦它们持有了 Activity、Fragment、监听器这类短命对象的强引用,后者就跟着“卡住”不释放。
Handler、AsyncTask 匿名子类、线程任务等,如果写成非静态内部类,会隐式持有外部类(比如 Activity)的强引用。一旦这个内部类被投递到主线程消息队列或线程池里长期待命,Activity 就无法回收。
立即学习“Java免费学习笔记(深入)”;
Connection、InputStream、Socket、Cursor 这些对象背后连着操作系统资源(文件句柄、socket 描述符)。不 close,不仅堆内对象不释放,更可能先耗尽系统级资源,引发 IOException 或崩溃。
不复杂但容易忽略。关键不在“设 null”,而在让引用待在该待的地方、及时松手。