经常会有朋友找我吹水,最近就说到了一个面试题

  谈谈对Java中几种引用的理解。

  因此打算以该面试题为例子,写篇文章说说在Java中引用是什么以及怎么用。

  【划重点:给你三秒钟时间思考,如果是你,该如何回答面试官的这个问题呢】

  引用是什么

  【划重点】在Java中引用包括:

  FinalReference 强引用

  SoftReference 软引用

  WeakReference 弱引用

  PhantomReference 虚引用

  那么为什么会提供这四种引用呢,主要原因有:

  方便Jvm进行垃圾回收

  方便开发人员使用,开发人员可以灵活的决定某些对象的生命周期

  日常开发如何使用

  学以致用,那么这几个引用在日常中我们如何进行使用呢?

  接下来我会给出相关demo!!!

  FinalReference 强引用

  类似于 Object o = new Object() 这类的引用,创建一个对象后,该引用会被保存在JVM栈中,而且只要强引用存在,垃圾回收器就不会回收掉被引用的对象。

  日常使用

  强引用的例子比比皆是,因为在日常开发中我们是会经常去new一个对象的,而该new出来的对象便是强引用的,也就是说只要该引用存在,垃圾回收器就不会回收掉。

  【划重点:JVM怎么知道引用在不在?】

  SoftReference 软引用

  软引用关联的对象,在内存不够的情况下,会把这些软引用关联的对象列入垃圾回收范围中,然后进行回收,也就是说软引用并非是完全安全的,在内存不够的情况下是会被垃圾回收器回收掉的。

  给出demo

  

  通过注释便可以知道,我这里实例化了多个大对象,然后放入softReferences数组中,之后便遍历打印出其中的对象的命名,打印结果如下

  

  可以通过结果看出,前面四个对象因为内存不够而被垃圾回收器回收了。

  日常使用

  在我司的项目中,部分是使用软引用来保存从数据库中取出的数据,具体是做了一个中间层的封装,该中间层的作用就是在get出数据的时候会去判断数据是否为null,如果是为null再次从数据库读取,读取后再放入软引用的集合中,这样的做法是可以避免内存溢出。

  WeakReference 弱引用

  弱引用比软引用更弱,被弱引用关联的对象只能存活到发生下一次垃圾回收之前,也就是说当发生GC时,无论当前内存是否足够,都会被回收掉。

  给出demo

  

  代码很简短,就是先构建一个弱引用对象,然后在gc前先打印出来证明它存在过,之后手动调用gc,再次打印,可以看出已经没了。运行结果如下

  

  PhantomReference 虚引用

  虚引用和上面不同的地方在于,一个对象是否有虚引用的存在,完全不会对其生存时间构成如何影响,并且也无法通过虚引用来获取一个对象的实例,也就是说跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

  那么这样就很容易产生疑问了,虚引用的作用又是什么呢?

  作用就是能在这个对象被收集器回收时收到一个系统通知,实现追踪垃圾收集器的回收动作,比如在对象被回收的时候,会调用该对象的finalize方法。

  在给出相关demo前,要先介绍一个

  ReferenceQueue 引用队列

  ReferenceQueue 引用其实也可以归纳为引用中的一员,可以和上述三种引用类型组合使用【软引用、弱引用、虚引用】。

  那么它有何作呢?

  在创建Reference时,手动将Queue注册到Reference中,而当该Reference所引用的对象被垃圾收集器回收时,JVM会将该Reference放到该队列中,而我们便可以对该队列做些其他业务,相当于一种通知机制。

  给出demo

  

  可以从demo中看出队列的用法,运行打印结果如下

  

  我们可以从结果中看到先是从引用中get出来的对象为null,证明上面说的无法通过虚引用来获取一个对象的实例,并且在回收后会被放入队列中。

  和Reference相关的概念

  首先为了方便JVM进行管理,Reference是有状态的,可以分为以下四种状态

  active 一般来说内存一开始被分配的状态,而当被引用的对象的可达性发生变化后gc就会将引用放入pending队列并将其状态改为pending状态。

  pending 指的是准备要被放进pending队列的对象。

  enqueue 指的是对象的内存已经被回收了。

  inactive 这是最终的状态,不能再变为其它状态。

  JVM怎么知道引用在不在

  关于JVM怎么知道引用在不在,这就涉及到了JVM的可达性分析算法了

  JVM的可达性分析算法的简单思路就是通过一系列GC Roots作为出发点,向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链,即表明从GC Roots到这个对象不可达时,证明此对象不可用,可被回收。如下图所示

  

  对象4、5、6都是可被回收的。

  那么问题来了,哪些对象可以作为GC Roots呢?

  这里给出几个,如下

  虚拟机栈中引用的对象

  方法区中类静态属性引用的对象

  方法区中常量引用的对象

  本地方法栈JNI引用的对象

  具体的想要深入研究的可以自行百度谷歌,或者等我后面深入分析。

  最后的最后

  该篇文章基本解答了【谈谈对Java中几种引用的理解】,如果想要更深入的研究,就要从源码入手了解了。

  下次遇见这种面试题,基本上就不慌了,因为实际上只要认真看完该篇文章并且记住几个关键的地方,基本上就不会被面试官问倒了,并且该篇文章后面也解答了【JVM怎么知道引用在不在】和【哪些对象可以作为GC Roots】的问题。

连引用都答不上,凭什么说你是Java服务端开发相关推荐

  1. 人人都能掌握的Java服务端性能优化方案

    转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响 ...

  2. web上传zip大文件,java服务接收并解压ZIP文件

    目录 一.背景 二.知识点 三.代码实现 1.依赖 2.web 代码 3. java服务端 一.背景 公司产品小伙伴画了原型后,需要上传到服务器上供开发查看:由于文件数量很多,100M左右差不多要传3 ...

  3. 最近面试一个6年 Java程序员,一个问题都答不上!

    最近看了很多简历,很多候选人年限不小,但是做的都是一些非常传统的项目,想着也不能通过简历就直接否定一个人,何况现在大环境越来 越难,大家找工作也不容易,于是就打算见一见. 在沟通中发现,由于年限不小, ...

  4. 在浏览器进行大文件分片上传(java服务端实现)

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 最近在做web网盘的系统,网盘最基本的功能便是文件上传,但是文件上传当遇到大文件的时候,在web端按传统方式上传简直是 ...

  5. 微信小程序开发之图片上传+Java服务端接收

    闲言少叙直入正题 前端代码在网上一搜一大堆,且搜出来的结果基本上是正确的,没啥好说的,我连代码都不想贴(如果有时间的话明天整理下贴在文章结尾,没时间的话就不贴了).但是,但是,但是,靠谱的,不用改动就 ...

  6. iOS:每个APP都用得上的SegmentedView(Swift版本),让你的开发效率提高一个Level

    腾讯新闻.今日头条.QQ音乐.网易云音乐.京东.爱奇艺.腾讯视频.淘宝.天猫.简书.微博等所有主流APP分类切换滚动视图 与其他的同类三方库对比的优点: 指示器逻辑面向协议编程(Protocol Or ...

  7. 网页连接不上java服务端,用Java插入IP时无法连接到服务器

    好的,我正在尝试学习Java客户端/服务器方面的知识,并且正在按照以下教程代码进行操作.当我将" localhost"更改为我的IP时,它将停止工作.请帮忙. 编辑:" ...

  8. java的io安卓能用吗_阳光沙滩-用java写了一个Socket.IO的服务端,可是用安卓一直连接不上怎么办;...

    在IDEA里面分别写了服务端(Server)和客户端(Client),用localhost可以互相连接成功,发送信息.但是,我在安卓里面写服务端,就一直连接不上,提示连接失败 IDEA java服务端 ...

  9. DotNetty系列六:将服务端和客户端改为Winform窗口,使用Redis做为缓存,实现用户登录,好友,群组上下线显示。

    这次改动挺大的. 1.服务端和客户端改为Winform窗口.好多细节未处理,只是实现了功能.     2.使用Redis做为缓存,版本redis-3.0.1,和RedisDesktopManager做 ...

最新文章

  1. DRF工程搭建、环境安装与配置
  2. Apache简单配置(4)搭建Discuz 7.0.0论坛
  3. hdu 5086(dp)
  4. linux怎么用两个进程传值,关于linux:将变量脚本参数传递给另一个脚本,然后将qsub传递给程序...
  5. 26行代码AC_试题 历届试题 日期问题 | 第八届蓝桥杯B组第七题
  6. 转载一个不错的Scrapy学习博客笔记
  7. maven 生成本地库_在2017年从Maven工件生成P2存储库
  8. java面试之HashMap延伸出来的--什么是ConcurrentHashMap?
  9. html5 教程网站
  10. 生产环境sql语句调优实战第三篇
  11. python 核心编程 练习题
  12. CentOS 添加微软雅黑字体
  13. xcode联调设备出现“ ineligible Device”解决
  14. java referencequeue,Reference 、ReferenceQueue 详解
  15. c# Npoi导出Excel并合并行列
  16. 计算机切换输入法Word关闭,win7旗舰版64位系统下word程序无法切换输入法的解决方法...
  17. 多边形的单边裁剪算法-JS
  18. 万变不离其宗之ZYNQ串口介绍
  19. 布施改变命运的亲身证明_huadingjin_新浪博客
  20. Python入门及技术指南

热门文章

  1. 7、ARM嵌入式系统:LCD/数码管/OLED初始化
  2. 工厂方法(整理自李建忠C++设计模式视频)
  3. VTK:体绘制裁剪——Clipping技术
  4. 大数据离线流程(小练习)
  5. 简单易懂ppi和dpi的本质和由来
  6. Window下编译 64位ffmpeg 引入libx264及libmp3lame编码库
  7. 面试题:打印螺旋数字
  8. java毕业生设计医院分诊管理系统计算机源码+系统+mysql+调试部署+lw
  9. opencv打开相机获取图像并保存
  10. MySQL启动服务提示:某些服务在未由其他服务或程序使用时将自动停止