全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

单例模式垃圾回收_动力节点Java学院整理

讨论命题:当一个单例的对象长久不用时,会不会被jvm的垃圾收集机制回收。

        首先说一下为什么会产生这一疑问,笔者本人再此之前从来没有考虑过垃圾回收对单例模式的影响,直到去年读了一本书,《设计模式之禅》秦小波著。在书中提到在j2ee应用中,jvm垃圾回收机制会把长久不用的单例类对象当作垃圾,并在cpu空闲的时候对其进行回收。之前读过的几本设计模式的书,包括《Java与模式》,书中都没有提到jvm垃圾回收机制对单例的影响。并且在工作过程中,也没有过单例对象被回收的经历,加上工作中很多前辈曾经告诫过笔者:尽量不要声明太多的静态属性,因为这些静态属性被加载后不会被释放。因此对jvm垃圾收集会回收单例对象这一说法持怀疑态度。渐渐地,发现在同事中和网上的技术人员中,对这一问题也基本上是鲜明的对立两派。那么到底jvm会不会回收长久不用的单例对象呢。

        对这一问题,笔者本人的观点是:不会回收

下面给出本人的测试代码

class Singleton {
 private byte[] a = new byte[6*1024*1024];
 private static Singleton singleton = new Singleton();
 private Singleton(){}
 
 public static Singleton getInstance(){
 return singleton;
 }
}

class Obj {
 private byte[] a = new byte[3*1024*1024];
}

public class Client{
 public static void main(String[] args) throws Exception{
 Singleton.getInstance();
 while(true){
  new Obj();
 }
 }
}


        本段程序的目的是模拟j2ee容器,首先实例化单例类,这个单例类占6M内存,然后程序进入死循环,不断的创建对象,逼迫jvm进行垃圾回收,然后观察垃圾收集信息,如果进行垃圾收集后,内存仍然大于6M,则说明垃圾回收不会回收单例对象。

        运行本程序使用的虚拟机是hotspot虚拟机,也就是我们使用的最多的java官方提供的虚拟机,俗称jdk,版本是jdk1.6.0_12

        运行时vm arguments参数为:-verbose:gc -Xms20M -Xmx20M,意思是每次jvm进行垃圾回收时显示内存信息,jvm的内存设为固定20M。

运行结果:

……
[Full GC 18566K->6278K(20352K), 0.0101066 secs]
[GC 18567K->18566K(20352K), 0.0001978 secs]
[Full GC 18566K->6278K(20352K), 0.0088229 secs]
……

        从运行结果中可以看到总有6M空间没有被收集。因此,笔者认为,至少在hotspot虚拟机中,垃圾回收是不会回收单例对象的。

        后来查阅了一些相关的资料,hotspot虚拟机的垃圾收集算法使用根搜索算法。这个算法的基本思路是:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。通过一系列名为根(GC Roots)的引用作为起点,从这些根开始搜索,经过一系列的路径,如果可以到达java堆中的对象,那么这个对象就是“活”的,是不可回收的。可以作为根的对象有:

  • 虚拟机栈(栈桢中的本地变量表)中的引用的对象。
  • 方法区中的类静态属性引用的对象。
  • 方法区中的常量引用的对象。
  • 本地方法栈中JNI的引用的对象。

        方法区是jvm的一块内存区域,用来存放类相关的信息。很明显,java中单例模式创建的对象被自己类中的静态属性所引用,符合第二条,因此,单例对象不会被jvm垃圾收集。

        虽然jvm堆中的单例对象不会被垃圾收集,但是单例类本身如果长时间不用会不会被收集呢?因为jvm对方法区也是有垃圾收集机制的。如果单例类被收集,那么堆中的对象就会失去到根的路径,必然会被垃圾收集掉。对此,笔者查阅了hotspot虚拟机对方法区的垃圾收集方法,jvm卸载类的判定条件如下:

  • 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
  • 加载该类的ClassLoader已经被回收。
  • 该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

        只有三个条件都满足,jvm才会在垃圾收集的时候卸载类。显然,单例的类不满足条件一,因此单例类也不会被卸载。也就是说,只要单例类中的静态引用指向jvm堆中的单例对象,那么单例类和单例对象都不会被垃圾收集,依据根搜索算法,对象是否会被垃圾收集与未被使用时间长短无关,仅仅在于这个对象是不是“活”的。假如一个对象长久未使用而被回收,那么收集算法应该是最近最长未使用算法,最近最长未使用算法一般用在操作系统的内外存交换中,如果用在虚拟机垃圾回收中,岂不是太不安全了?以上是笔者的观点。

        因此笔者的观点是:在hotspot虚拟机1.6版本中,除非人为地断开单例中静态引用到单例对象的联接,否则jvm垃圾收集器是不会回收单例对象的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # 单例模式  # 垃圾回收  # Java垃圾回收之复制算法详解  # Java垃圾回收之标记清除算法详解  # 详解Java内存管理中的JVM垃圾回收  # Java垃圾回收机制简述  # 简单了解Java垃圾回收器的种类  # 简单介绍Java垃圾回收机制  # 快速理解Java垃圾回收和jvm中的stw  # 老生常谈Java虚拟机垃圾回收机制(必看篇)  # 老生常谈java垃圾回收算法(必看篇)  # Java 垃圾回收机制详解及实例代码  # 关于Java垃圾回收开销降低的几条建议  # Java 详解垃圾回收与对象生命周期  # Java垃圾回收器的方法和原理总结  # Java文件流关闭和垃圾回收机制  # Java垃圾回收之标记压缩算法详解  # 这一  # 堆中  # 会不会  # 书中  # 用在  # 区中  # 类中  # 加载  # 就会  # 太多  # 是有  # 也没  # 最多  # 没有任何  # 设为  # 长时间  # 会在  # 并在  # 有过  # 对其 


相关文章: 建站主机助手选型指南:2025年热门推荐与高效部署技巧  北京专业网站制作设计师招聘,北京白云观官方网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  深圳网站制作培训,深圳哪些招聘网站比较好?  建站168自助建站系统:快速模板定制与SEO优化指南  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  ,在苏州找工作,上哪个网站比较好?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  Android滚轮选择时间控件使用详解  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  Android自定义控件实现温度旋转按钮效果  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何在阿里云部署织梦网站?  广州建站公司哪家好?十大优质服务商推荐  高端云建站费用究竟需要多少预算?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  专业公司网站制作公司,用什么语言做企业网站比较好?  网站制作企业,网站的banner和导航栏是指什么?  如何在IIS中新建站点并解决端口绑定冲突?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  如何快速生成高效建站系统源代码?  如何在企业微信快速生成手机电脑官网?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  C#如何使用XPathNavigator高效查询XML  如何选择CMS系统实现快速建站与SEO优化?  ,怎么在广州志愿者网站注册?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  建站主机CVM配置优化、SEO策略与性能提升指南  如何在西部数码注册域名并快速搭建网站?  建站之星安装后如何自定义网站颜色与字体?  nginx修改上传文件大小限制的方法  如何在建站之星网店版论坛获取技术支持?  网站制作公司,橙子建站是合法的吗?  免费视频制作网站,更新又快又好的免费电影网站?  制作网站的软件免费下载,免费制作app哪个平台好?  建站之星安装路径如何正确选择及配置?  临沂网站制作企业,临沂第三中学官方网站?  建站之星2.7模板快速切换与批量管理功能操作指南  浅谈Javascript中的Label语句  常州自助建站费用包含哪些项目?  开封网站制作公司,网络用语开封是什么意思?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  公司网站制作需要多少钱,找人做公司网站需要多少钱?  宝塔建站助手安装配置与建站模板使用全流程解析  如何自定义建站之星网站的导航菜单样式?  MySQL查询结果复制到新表的方法(更新、插入)  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  建站主机解析:虚拟主机配置与服务器选择指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。