//强引用,垃圾收集器不会碰这种对象。
byte[] bytes = new byte[1024 * 1024 * 8];
//软引用,一般不会被回收,只有当内存不足时,才会被回收。(会引起OOM异常)一般可以当作缓存来使用,Glide 图片加载框架的内存缓存就使用到了弱引用缓存机制
//OOM - OutOfMemory
SoftReference<String> softReference = new SoftReference<>(new String("jeff.chan"));
//弱引用,只能存活到下一次垃圾回收之前,如果进行垃圾回收,那么一定会被回收
//ThreadLocal里面使用到了弱引用对象,可以减少内存泄漏的发生
WeakReference<String> weakReference = new WeakReference(new String("jeff.chan"));
//虚引用,必须要搭配队列使用.仅仅提供了一种确保对象被finalize以后,做某些事情的机制。
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> phantomReference = new PhantomReference<>(new String("jeff.chan"), queue);
phantomReference.get();
而目前比较流行的回收算法是可达性分析算法。
什么是内存泄漏
内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。
对对象进行弱引用不会影响垃圾回收器回收该对象,即如果一个对象只有弱引用存在了,则下次GC将会回收掉该对象(不管当前内存空间足够与否)。
再来说说内存泄漏,假如一个短生命周期的对象被一个长生命周期对象长期持有引用,将会导致该短生命周期对象使用完之后得不到释放,从而导致内存泄漏。
因此,弱引用的作用就体现出来了,可以使用弱引用来引用短生命周期对象,这样不会对垃圾回收器回收它造成影响,从而防止内存泄漏。
字符串缓存
在我们创建字符串对象并调用intern()方法的时候,如果已经有缓存的字符串,就会返回缓存里的实例。
今日String/StringBuffer/StringBuilder心得: