博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解Java虚拟机阅读心得(二)
阅读量:6856 次
发布时间:2019-06-26

本文共 1739 字,大约阅读时间需要 5 分钟。

深入理解Java虚拟机阅读心得(二)

垃圾收集

  程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题。而Java堆和方法区则不一样。

  Java堆中存储了几乎所有的对象实例,垃圾收集器进行对堆的回收之前,需要判断这些对象是否还存活

 

一。判断对象是否存活

  判断对象是否还活着,主要有两种方法

  1.引用计数法

    给对象添加一个引用计数器,每当一个地方引用时,计数器值加1;

    每当一个引用失效时,计数器减1;

    任何计数器为0的对象为不可能被使用的对象。

    

    优点:实现简单,判定效率高   

    缺点:很难解决对象之间的相互循环引用的问题

 

  2.可达性分析法

    主流的实现中,都是通过可达性分析法来判定对象是否存活。

    该算法基本思想:通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索的路径称为引用链;

            当一个对象到GC Roots没有任何引用链相连时(即GC Roots无法到达该对象),称为不可达对象,该对象不可用

            此时,可以判定该对象是可回收的对象。

    Java中可以作为GC Roots的对象包括以下四种:

            (1)虚拟机栈中引用的对象

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

            (3)方法区中常量引用的对象

            (4)本地方法栈中JNI(一般说的是Native方法)引用的对象

 

  3.方法区的回收

    由于方法区中主要存放的是永久代对象,因此,方法区中进行垃圾收集的性价比一般较低。

    永久代的垃圾回收主要分为两类:1.废弃常量   2.无用的类

    类的卸载条件比较苛刻,需要同时满足以下三个条件:

      (1)该类的所有实例已经被回收,即Java堆中不存在该类的任何实例

      (2)加载该类的ClassLoader(即类加载器)已被回收

      (3)该类对应的java.lang.Class对象没有在任何地方呗引用,无法在任何地方通过反射访问该类的方法

 

    在大量使用动态代理、反射的场景,需要虚拟机具备卸载类的功能,以保证永久代不会造成内存溢出

    

  4.finalize()

    类似 C++ 的析构函数,用于关闭外部资源。

    但 try-finally 等方式可以做得更好,并且该方法运行代价很高,不确定性大,无法保证各个对象的调用顺序,因此最好不要使用。

    当一个对象可被回收时,且被判定为有必要执行该对象的 finalize() 方法,那么可能让该对象自救(只需要重新与引用链上的任何一个对象建立关系即可)。

    自救只能进行一次,如果回收的对象之前调用了 finalize() 方法自救,后面回收时不会再调用该方法。

 

二。强引用与软引用

  Java对引用的概念分为四种,从强到弱依次为:强引用,软引用,弱引用,虚引用

  1.强引用

    代码中普遍存在的类似 Object obj = new Object()这种,只要强引用在,该对象永远不会被回收

  

  2.软引用

    用来描述一些还有用但非必须的对象;提供了SoftReference类来实现软引用

    在系统发生内存溢出异常之前,会把这些对象列入回收范围之中,进行第二次回收

 

  3.弱引用

    也是用来描述非必须对象,但是比软引用更弱;提供了WeakReference类来实现

    弱引用关联的对象,只能生存到下一次垃圾收集发生之前。

    当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

 

  4.虚引用

    最弱的引用关系;提供PhantomReference类实现

    一个对象是否有虚引用的存在完全不会对其生存时间产生影响,同时也无法通过虚引用来取得一个对象的实例。

    设置虚引用的唯一目的是,通过虚引用在这个对象被回收时收到一个系统通知

原文地址

转载地址:http://ernyl.baihongyu.com/

你可能感兴趣的文章
k8s拾遗 - Secret
查看>>
Android SparseArray 原理解析
查看>>
PHP类的定义
查看>>
Composer 中国镜像地址配置
查看>>
比特币暴跌后的连锁反应
查看>>
Python爬虫入门教程 62-100 30岁了,想找点文献提高自己,还被反爬了,Python搞起,反爬第2篇...
查看>>
第80节:Java中的MVC设计模式
查看>>
区块链100讲:以实例形式深入浅出讲透BANCOR算法
查看>>
Java并发编程 深入剖析volatile关键字
查看>>
drop delete truncate 区别
查看>>
ios面试题
查看>>
[RQNOJ]PID2-开心的金明
查看>>
GZipStream的简单使用
查看>>
java生成MD5校验码及算法实现
查看>>
thymeleaf 学习笔记(转)
查看>>
Mac 升级 OpenSSL
查看>>
Python学习笔记(5)-if判断、if嵌套、判断小练习
查看>>
文本转换成音频流
查看>>
负载均衡之lvs
查看>>
C#之类与对象知识点
查看>>