一直没看到基于弱引用(java.lang.ref.WeakReference)的合适的例子,直到阅读Lucene-core的代码,发现了这么一段:
public class CloseableThreadLocal<T> implements Closeable { private ThreadLocal<WeakReference<T>> t = new ThreadLocal<WeakReference<T>>(); // Use a WeakHashMap so that if a Thread exits and is // GC'able, its entry may be removed: private Map<Thread,T> hardRefs = new WeakHashMap<Thread,T>(); // Increase this to decrease frequency of purging in get: private static int PURGE_MULTIPLIER = 20; // On each get or set we decrement this; when it hits 0 we // purge. After purge, we set this to // PURGE_MULTIPLIER * stillAliveCount. This keeps // amortized cost of purging linear. private final AtomicInteger countUntilPurge = new AtomicInteger(PURGE_MULTIPLIER); protected T initialValue() { return null; } public T get() { WeakReference<T> weakRef = t.get(); if (weakRef == null) { T iv = initialValue(); if (iv != null) { set(iv); return iv; } else { return null; } } else { maybePurge(); return weakRef.get(); } } ... ....
这里面用的很好:由于ThreadLocal在使用上并么有数量的限制,需要靠使用者手工删除的方式才能释放对象的引用,因此实际上很容易造成内存泄露,而CloseableThreadLocal使用WeekReference的方式缓存ThreadLocal的数据,很好地解决了这个问题,Perfect!
相关推荐
`ThreadLocalMap`使用弱引用作为键,目的是在线程不再引用ThreadLocal对象时,允许垃圾回收器回收该对象,从而避免内存泄漏。然而,如果线程仍然存活并且`ThreadLocalMap`中的值没有被其他引用保持,那么可能会出现...
2. **匿名内部类与ThreadLocal的结合**:在匿名内部类中使用ThreadLocal,由于内部类会隐式持有对外部类的引用,如果外部类对象很大,且线程持续存在,那么这个大的外部类对象也无法被垃圾收集,从而引发内存泄露。...
当ThreadLocal变量不再使用时,应当及时调用`remove()`方法,避免弱引用的ThreadLocal对象在无外部引用后无法被GC回收,进而引起内存泄漏。 5. **其他常见面试知识点** - **集合框架**:理解List、Set、Map接口...
西安电脑技术培训华美校区提到的六个Java功能包括反射、字节码操作、ThreadLocal、类加载器、弱引用/软引用以及套接字。以下是这些功能的具体说明及其潜在风险: 1. **反射(Reflection)**:反射允许程序在运行时...
然而,如果不正确地使用ThreadLocal,可能会导致内存泄漏,这正是“JUC-ThreadLocal内存泄漏弱引用.png”和“JUC-ThreadLocal内存泄漏强引用.png”所要揭示的问题。 “TimeUnit.md”可能涵盖了Java中的TimeUnit枚举...
19. **ThreadLocalMap的键是弱引用**:ThreadLocalMap的键使用弱引用,当没有其他引用指向ThreadLocal实例时,垃圾收集器可以回收ThreadLocal,从而避免内存泄漏。 20. **防止ThreadLocal内存泄漏**:及时清理不再...
面试中可能探讨新生代和老年代、Minor GC和Full GC、引用类型(强引用、软引用、弱引用、虚引用)以及内存泄漏的问题。 五、并发编程 Java提供了丰富的并发工具类,如synchronized、volatile、ThreadLocal、...
面试中可能会涉及到对象生命周期、引用类型(强引用、软引用、弱引用、虚引用)以及GC的工作原理。 再者,对于客户端开发,线程同步与并发控制是常见考点。Java提供了多种线程同步机制,如synchronized关键字、wait...
1. 适当地使用弱引用(WeakReference)、软引用(SoftReference)和虚引用(PhantomReference)。 2. 避免使用静态集合类,尤其是在不需要长期存储数据的情况下。 3. 使用完线程局部变量后及时清理。 4. 及时解除...
1. 使用弱引用(WeakReference)或软引用(SoftReference):这些类型的引用不会阻止对象被垃圾收集,一旦对象只被弱引用或软引用持有,GC就会回收它。 2. 注意生命周期管理:确保在不再需要对象时,解除对其的引用...
有强引用、软引用、弱引用和虚引用四种类型,分别对应不同的内存管理策略,如垃圾回收时对引用对象的处理。 2. **Java多线程相关知识**:Java通过Thread类和Runnable接口支持多线程编程。线程间通信可以使用wait(),...
6. **内存管理**:Java的垃圾收集机制是自动进行的,但理解对象生命周期、内存泄漏、引用类型(强引用、软引用、弱引用、虚引用)等对于优化程序性能至关重要。 7. **JVM**:Java虚拟机是Java运行的基础,面试中...
- **弱引用**:在下一次GC时一定会被回收。 - **虚引用**:主要用于跟踪对象的销毁过程。 #### JUC/并发相关知识点 - **ThreadLocal原理**:每个线程拥有独立的副本,避免了线程间的共享和竞争。 - **Synchronized...
- **弱引用**:更弱一些的引用类型,在下一次垃圾回收时会被回收。 - **虚引用**:无法通过虚引用来获取对象实例,主要用来跟踪对象被垃圾回收的过程。 6. **`hashcode` 的作用**: - `hashcode` 方法返回对象的...
5. **内存管理与垃圾回收**:理解Java内存模型(堆、栈、方法区、本地方法栈),垃圾收集机制(GC)的工作原理,包括可达性分析、引用类型(强、弱、软、虚)以及GC算法(标记-清除、复制、标记-整理、分代收集)。...
- **内存优化**:减少不必要的对象创建,使用软引用、弱引用来管理非关键资源。 - **CPU优化**:避免过多的计算密集型操作,合理利用线程池。 - **I/O优化**:使用异步加载技术,如AsyncTask、HandlerThread等。 - *...
理解对象生命周期、引用类型(强、软、弱、虚引用)以及如何进行性能优化(例如,使用G1、ZGC等现代垃圾收集器)对于写出高效、无内存泄漏的代码至关重要。 3. 泛型:泛型引入了类型参数化,提高了代码的类型安全性...
43. **线程安全的弱引用**:`WeakReference`, `SoftReference`在多线程环境下的应用和注意事项。 44. **线程池的定时任务**:`ScheduledExecutorService`接口,实现定时和周期性任务。 45. **线程池的任务提交**:...
6.9.4 对象的软、弱和虚引用 230 6.10 修饰符的适用范围 233 6.11 使用JAR文件 234 6.11.1 jar命令详解 235 6.11.2 创建可执行的JAR包 237 6.11.3 关于JAR包的技巧 238 6.12 本章小结 239 本章练习 239 第7...
引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................