生命周期长的集合 将对象放入静态或生命周期很长的集合如 publicstaticListObject list new ArrayList();即使后面不再需要集合仍持有其引用导致无法GC。2、未关闭的资源连接、流等资源未调用close()方法关闭。这些资源不仅占用内存还可能占用文件句柄操作系统分配的唯一标识凭它你才能操作文件资源、网络连接等系统资源。比如 数据库连接、文件流FileInputStream、Socket连接 等。public class FileTest { public static void main(String[] args) { FileInputStream fis null; try { fis new FileInputStream(test.txt); // 读取文件未调用 fis.close() } catch (FileNotFoundException e) { e.printStackTrace(); } finally { // 未调用 fis.close() → fis 持有 Native 引用无法回收 } } }3、ThreadLocal 使用不当将对象存入ThreadLocal后未在后续调用remove()清理。若线程来自线程池会复用其 ThreadLocalMap 中的值会一直存活。public class ThreadLocalTest { private static ThreadLocalUser userThreadLocal new ThreadLocal(); public static void main(String[] args) { // 线程池核心线程长期存活 TThreadPoolExecutor executor new ThreadPoolExecutor( 2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue(100), new ThreadFactoryBuilder().setNameFormat(my-thread-pool-%d).setDaemon(false).setPriority(Thread.NORM_PRIORITY).build(), new ThreadPoolExecutor.AbortPolicy() ); executor.submit(() - { User user new User(李四, 30); userThreadLocal.set(user); // 存储到 ThreadLocal // 业务执行完毕未调用 remove() // 核心线程不会销毁ThreadLocal 仍持有 user 引用 }); } }ps未进行remove()还可能会导致ThreadLocal取值串门。4、内部类与外部类引用非静态内部类或匿名类会隐式持有外部类的引用。如果内部类实例生命周期更长如被缓存或另一个线程引用会阻止外部类被回收。public class OuterClass { private byte[] bigData new byte[1024 * 1024 * 10]; // 10MB 大对象 // 非静态内部类 class InnerClass { // 内部类隐式持有 OuterClass 引用 } public InnerClass createInner() { return new InnerClass(); } public static void main(String[] args) { OuterClass outer new OuterClass(); InnerClass inner outer.createInner(); // 置空外部类引用但 inner 仍持有 outer 引用 outer null; // 若 inner 被静态变量/线程长期持有 → outer 对象含 bigData无法回收 } }5、 监听器与回调