爱站网关键词工具,wordpress 页面与文章,网站页面和图片设计,建设平面设计工作室网站方案#xff08;1#xff09;五种引用_强软弱 实线箭头表示强引用#xff0c;虚心线表示软弱虚终结器引用 在平时我们用的引用#xff0c;基本都为强引用 #xff0c;比如说创建一个对象通过运算符赋值给了一个变量#xff0c;那么这个变量呢就强引用了刚刚的对象
强引用的…1五种引用_强软弱 实线箭头表示强引用虚心线表示软弱虚终结器引用 在平时我们用的引用基本都为强引用 比如说创建一个对象通过运算符赋值给了一个变量那么这个变量呢就强引用了刚刚的对象
强引用的特点通过GC Root的引用链 能够找到它他就不会被垃圾回收
C对象 GC Root通过引用链可以找到A1对象那么它不能回收的
B对象 GC Root通过引用链可以找到A1对象那么A1它不能回收的
只有GC Root对它的引用都断开时它才能被垃圾回收
软 弱引用只要A2和A3这两个对象没有被直接的强引用所引用那么当垃圾回收时都可能被回收掉 当发生了垃圾回收回收完发现内存不够那么他会把软引用所引用的这个A2对象回收掉
当发生了垃圾回收不管是不是内存充足都会把弱引用所引用的A3对象回收掉 软引用可以配合一个引用队列
当软引用的对象被回收掉之后软引用自身也是一个对象在创爱时分配了一个引用队列当它所引用的对象被回收时软引用就会进入这个队列弱引用也是如此
为什么做这样的一个处理呢因为软引用或者弱引用也好他们自身也用占用一定的内存如果想把他们两个占用的内存做进一步的释放需要使用这个引用队列找到他们然后作进一步的处理 2五种引用_虚引用和终结器引用
虚引用和终结器引用必须配合引用队列来使用也就是说当虚引用创建的时候关联一个引用对列当终结器引用创建的时候也会关联一个引用对列 当创建ByteBuffer对象时会创建一个名为Cleaner的虚引用对象ByteBuffer会分配一块直接内存会把直接内存地址传递给虚引用对象当ByteBuffer以后没有别强引用后他自己可以别垃圾回收掉了但是它分配的那个直接内存并不能被java垃圾回收所管理所以当ByteBuffer别回收的时候让虚引用对象进入引用队列 引用队列会有一个referencrHandler的线程去这个队列里找有没有一个新入队的Cleaner如果有的haul会调用Cleaner中的方法clean根据前面记录的直接内存的地址调用Unsafe的freeMemary方法释放掉直接内存这样就会保证直接内存导致的内存泄露 我们知道所有的对象都会继承于Object对象父类Object里面都会有一个finallize方法一个终结方法当我这个对象重写了终结方法并没有强引用B对象那么它可以当成垃圾进行回收那么这个终结方法在什么时候调用呢那就是靠的终结器引用达到这个目的当没有强引用我的这个对象时对象会由虚拟机帮我们创建它对应的终结器引用当这个对象A4被垃圾回收时把终结器引用也加入引用队列再由一个优先级很低的一个线程在某个时机去这个引用队列是不是有终结器引用有的话会找到我们要作为垃圾回收的这个对象并且调用它的finallize方法等调用完了等下一次垃圾回收时就可以回收掉了 finallize工作效率还是很低第一次回收时不能把它回收掉需要先把终结器引用入队那个检查线程优先级很低可能造成这个对象的finallize方法迟迟不能调用这个对象占用的内存也迟迟不能释放索引我们不推荐使用finallize去释放资源的一个理由 3软引用_应用 设置堆聂村大小20兆 我们这往List集合里面循环放4个字节的数组比如说放4byte的图片由于图片的数量过多我们用强引用来引用这个图片资源就会导致下面的内存溢出的错误这些不重要的资源能不能在内存紧张时把它占用的内存释放掉以后用到这个图片我再读取一下不就行了嘛就不是使用给这个强引用场景了需要使用弱引用 我们不使用List直接去引用Byte数组啦他们之间加了一个SoftRerence软引用对象软引用对象呢再间接引用Byte数组 现在List和SoftRerence之间是强引用SoftRerence和Byte数组是一个软引用了 加上垃圾回收的虚拟机参数 循环5次并没有发生内存的溢出但是在最后再一次循环数组发现只有最优一个有数据前面几个都被回收掉了只有最后一个保留了下来
在第三次循环时内存已经很紧张了触发了一次垃圾回收 第四次循环发现还是不够又触发了一次MinarGC回收效率不高又触发了一次Full GC还是没有回收多少然后触发了软连接的垃圾回收一次垃圾回收后如果空间还是不够他就把软连接引用的对象释放掉这次垃圾回收之后我们发现新生代和老年代都得到巨大回收代价呢呢吧前四次的对象都回收掉了只要最后一个放了进去 新生代占77%,老年代占7%