面试题答案
一键面试潜在问题
- 缓存范围限制:
Integer
缓存范围默认是 -128 到 127。在高并发场景下,如果创建的Integer
对象值超出此范围,不会使用缓存,频繁创建新对象会增加内存开销与垃圾回收压力。 - 线程安全:虽然
Integer
缓存本身是线程安全的,但在高并发下,不同线程频繁获取缓存对象,可能会因为缓存命中竞争,导致性能问题。
性能和内存使用影响
- 性能方面:当创建的
Integer
对象值在缓存范围内,由于直接从缓存获取对象,减少了对象创建开销,能提高性能。但超出范围时,频繁创建新对象会增加 CPU 负担,降低性能。 - 内存方面:缓存机制在一定程度上减少了内存开销,因为相同值的对象只需在缓存中存储一份。然而,如果超出缓存范围的对象创建过于频繁,会导致内存占用增加。
利用或避免影响的方法
- 利用缓存:
- 尽量使创建的
Integer
对象值在缓存范围内,比如在一些计数场景中,如果计数范围在 -128 到 127 之间,可以直接使用Integer
缓存。 - 对于一些固定值的
Integer
,如状态码等,确保其在缓存范围内,这样在多线程使用时能利用缓存提升性能。
- 尽量使创建的
- 避免缓存问题:
- 若预计会创建大量超出缓存范围的
Integer
对象,可以考虑对象池技术。通过对象池复用对象,减少频繁创建和销毁对象的开销。 - 对于高并发下缓存竞争问题,可以使用线程本地存储(ThreadLocal)。每个线程维护自己的
Integer
缓存,减少缓存竞争。但要注意ThreadLocal
可能带来的内存泄漏问题,及时清理不再使用的ThreadLocal
变量。
- 若预计会创建大量超出缓存范围的