珠海达内IT教育培训学校
全国服务热线:400-035-8011

苏州Java培训能把学费赚回来吗

      苏州Java培训能把学费赚回来吗?当然可以,苏州java培训学校提供专业、全面、优质的java培训php培训、在Python培训linux云计算等培训课程,广州兄弟连教育严格、科学、负责的教务管理体系。

      一文彻底解析Java 中的弱引用  

      概览

  本文会通过对弱引用的定义讲起,然后通过案例的使用一步一步的深入源码进行分析其原理,从而让读者深刻的理解什么是弱引用,如何使用弱引用,什么场景下会使用弱引用,弱引用可以解决什么样的问题,以及它的源码实现是怎样的,其中会涉及的内存溢出,垃圾回收原理

苏州Java培训能把学费赚回来吗

  作用:

  jdk 解释:

  弱引用主要应用在不阻止它的key或者value 被回收的mapping。直接贴英文吧,翻译水平有限(weak references are for implementing canonicalizing mappings that do not prevent their keys (or values) from being reclaimed)

  个人理解:

  弱引用的出现就是为了垃圾回收服务的。它引用一个对象,但是并不阻止该对象被回收。如果使用一个强引用的话,只要该引用存在,那么被引用的对象是不能被回收的。弱引用则没有这个问题。在垃圾回收器运行的时候,如果一个对象的所有引用都是弱引用的话,该对象会被回收

  案例深度解析

  理想的情况下,我们希望当我们不再使用一个对象的时候,能够在gc 发生的时候就把它回收掉。但是有些时候,由于我们的粗忽,在坏的情况下会导致内存溢出。这种案例尤其发生在一个生命使用周期很长的map 存放了很多实际使用生命的对象。请看下面这个例子

        运行后输出结果:

  gc 发生前:1开始通知GCgc 发生后:1复制代码

  从输出的结果可以看到,即使我们通过把key和value 设置为null 来告诉jvm,我们不再使用这个对象了,map 里面对象依然没有被GC 回收,因为key和value 被一个强引用map 指向,根据可达性判断,垃圾回收器是不能回收掉key和value 这个对象的。map 被定义为statis 的静态变量,是一个使用生命周期很长的对象。在strongTest()方法中存在了一个key和value 的局部变量,它随着方法的执行完,这个变量的生命使用周期就结束了,但是粗糙的程序员忘记remove 了,这个时候垃圾回收器是不能回收它的。如果这种生命周期相对短的对象很多,终就有可能消耗掉JVM中全部的内存。


  但是这里我有一个好奇,假如这里的key和value 指向的对象在执行完strongTest()方法 以后用不着了,但是我可能又不是很好的判断去主动调用remove 来移除它。想要垃圾回收器自己判断回收掉可不可以呢?答案其实是可以的,这个时候就是弱引用上场了,请看下面程序

        运行上面代码输出结果

  gc 发生前:1开始通知GCgc 发生后:0复制代码

  从输出结果0,我们可以判断已经成功被垃圾回收了。what?整个过程我们只是把HashMap 换成了WeakHashMap,并且key 由String 换成了WeakReference。其实就是由于字符串只有弱引用指向,所以可以被垃圾回收掉。是不是很简单,如果到这里你就停止研究弱引用了,那就太暴殄天物了

  WeakHashMap 深度解析

  上面的程序片段中,其实只有key 设置了为弱引用new WeakReference(key),那正常也就只有这个key 对应的内存被回收而已,由于没有调用remove ,里面的value 和entry 也是不会回收掉的,那为什么后输出的size 是0 呢? 很好的问题,我们深入去看WeakHashMap 的源码,我们发现了一个神奇的方法expungeStaleEntries()。在看源码之前先解析下引用队列的概念: 在弱引用被回收的时候会把该对象放到引用队列中,也就意味着从引用队列中获取的对象都是被回收的对象,先解释到这里,足以满足我们下面的源码分析了,接下来会做详细的解析

  从上面的代码片段,大概的意思就是从引用队列里面取出被回收的对象,然后和WeakHashMap 中的对象查找,找到之后就把对应的value 也设置为null,并且把对应的entry 设置为null,来告诉GC 去回收它。从源码可以看到expungeStaleEntries() 这个方法在执行WeakHashMap中的任何方法的时候都会被调用到的

  到这里也就完全明白为什么value 不设置为弱引用和没有显性的调用remove 方法也可以回收掉了

  引用队列

  从上面的的源码中,我们大概知道了引用队列的使用,那为什么要使用引用队列呢?假如没有引用队列,上面的例子我们就需要遍历全部的元素一个一个的去找,如果数量少那还好,如果数量多的时候,肯定就会出现一些性能问题。有了引用队列那就轻松可以解决上面的问题了。从WeakReference 源码中我们可以看到有两个构造函数,第二个是需要传入引用队列的

       引用队列hello word

  使用中需要注意的细节: 由于弱引用的对象在GC 发生的时候都可能会被回收掉,所以在使用之前我们都需要判断下是否为null 来避免空指针异常

       总结

  弱引用的出现是为了垃圾回收的

  一个对象只有弱引用指向它的时候,它是可以被回收的

  弱引用是在GC 发生的时候就进行回收,不管当时内存是否充足

  如果你在创建弱引用指定一个引用队列的话,弱引用对象被回收的时候,会把该对象放入引用队列中

  为了安全使用,每次都要判断下是否为空来判断该对象是否已经被回收,来避免空指针异常

      WEB前端开发课程:

  第 一阶段

  WEB 开发基础 :数据库、H5基础、WEB SERVR、核心、Ajax

  第二阶段

  WEB 核心技术:CSS3、H5、JS、jQuery、DOM编程

  第三阶段

  WEB 前端进阶:Bootstrap、VueJS、AngularJS

  第四阶段

  移动端开发:Web APP、微信开发、React.js Native"、混编APP框架

  第五阶段

  WEB 全栈进阶:node.js 常用JS 框架

  辅导计划

  Node.Js辅导:MongoDB、Node.js



  Web前端全栈 应运而生 前景光明


  科技从未停下前进的脚步,2021Web前端全栈式强势来袭!




Web前端项目驱动教学,所需即所学,所学即所用.


参与企业真实的项目积累实战经验




  不是所有的IT教育都叫达内


  美国上市公司,17年深耕IT职业教育





  讲师团阵容豪华,云集实战讲师


  从实战中走出的讲师,传授真实项目经验





免费课程预约
每天限量名额,先到先得
二维码

扫一扫 免费领取试听课

尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/news/133001/违者必究! 以上就是珠海达内IT教育培训学校 小编为您整理苏州Java培训能把学费赚回来吗的全部内容。

版权所有:培训指南(www.peixun360.com) 技术支持:培训指南网

温馨提示:提交留言后老师会第一时间与您联系!热线电话:400-035-8011