1、判断对象已经死去/不再被引用。
1.1、引用计数算法:给对象添加引用计数器,有个地方引用就+1,引用失效就-1。任何时刻,引用为0,即判断对象死亡。
1.1.1、优点:实现简单,效率高。
  1.1.2、缺点:在主流的Java虚拟机中不被使用,因为很难解决对象之间相互循环引用的问题。
1.2、可达性分析算法(Java,C#,lisp):从一系列称为“GC Roots”的对象作为起始点,从这些节点往下搜索,搜索走过的路径称为引用链,当没有引用链可达到某对象时,认为该对象不可到达,即此对象没有被有效引用。
1.2.1:可做为GC Roots的对象:
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(Native方法)应用的对象
2、如何判断是否要被回收
在Java中,采用可达性分析算法。即使判断未不可达的对象,也不会立即宣告对象死亡。在此之前要经过至少两次标记:
2.1、第一次标记和筛选:当第一次判断该对象不可达(没有与GC Roots相连的引用链)时,进行筛选:是否要执行finalize()方法。
2.2、第二次:需要finalize()方法的对象会在一个低优先级的F-Queue中排队执行finalize()。如果在finalize()方法中拯救自己,那么就不会死。否则,被回收。
在finalize()方法中拯救自己:在改方法中重新连接上GC Roots(重新拥有连接GC Roots的引用)
2.3、总结:对象可以在被GC时自我拯救。这种拯救只有一次机会,因为GC只会调用一次对象的finalize()方法。
附自我拯救代码:
**
* Created by KEY on 2017/12/4.
*/
public class FinalizeEscapeGC {public static FinalizeEscapeGC SAVA_HOOK = null;public void isAlive(){System.out.println("yes, I am still alive");}@Overrideprotected void finalize() throws Throwable{super.finalize();System.out.println("finalize method executed");FinalizeEscapeGC.SAVA_HOOK = this;}public static void main(String[] args) throws Throwable{SAVA_HOOK = new FinalizeEscapeGC();//对象第一次拯救自己SAVA_HOOK = null;System.gc();//因为finalize优先级很低,所以等他0.5sThread.sleep(500);if(SAVA_HOOK != null){SAVA_HOOK.isAlive();}else{System.out.println("no,I am dead :(");}//重复以上代码,看是否能第二次拯救自己//对象第一次拯救自己SAVA_HOOK = null;System.gc();//因为finalize优先级很低,所以等他0.5sThread.sleep(500);if(SAVA_HOOK != null){SAVA_HOOK.isAlive();}else{System.out.println("no,I am dead :(");}}
}

  

3、方法区的垃圾回收
说明:虚拟机规范对于方法区的实现并没有要求是否回收,也没有要求如何回收,甚至没有要求具体的内存定义, 只需要满足方法区规范即可。所以方法区的回收再不同的虚拟机有不同的实现
方法区的回收主要针对“废弃常量”和“无用的类”。如何判断是否是“无用的类”
a.该类所有的实例都已经被回
b.加载该类的ClassLoader被回收
c.该类对应的java.lang.class对象没有在任何地方被引用,无法再任何地方通过反射访问该类的方法。

转载于:https://www.cnblogs.com/dhcao/p/10452065.html

JVM·垃圾收集器与内存分配策略之对象是否可被回收!相关推荐

  1. jvm垃圾收集器与内存分配策略

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集器与内存分配策略: 以下参考周志明的<<深入理解jvm高级特性与最佳实践>>. 判断对象是否存 ...

  2. JVM:垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 1.对象已死吗 1).引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就 ...

  3. java eden分配参数,JVM垃圾收集器与内存分配策略,

    垃圾收集器与内存分配策略 对象存活判断 引用计数算法 给对象添加一个计数器,每有一个引用+1,当引用失效-1,若为0则不在被使用. 可达性分析算法 对象是否可到达GC roots 或者说GC root ...

  4. JVM垃圾收集器与内存分配策略学习总结

    方法区: 1.线程共享 2.储存类信息,常量,静态变量,编译器编译后的代码 3.非堆(别名)用于区分Java堆 4.不需要连续的内存 5.可以固定或可扩张 6.选择不实现垃圾回收//这个区域很少进行垃 ...

  5. [JVM] 垃圾收集器与内存分配策略

    目录 简介 哪些内存需要回收 引用计数算法 可达性分析 再次谈引用 生存和死亡 简介 GC(Carbage Coolection),需要完成的3件事情 : 哪些内存需要回收 什么时候回收 如何回收 程 ...

  6. jvm(3)-垃圾收集器与内存分配策略

    [0]README 0.1)本文部分文字转自:深入理解jvm,旨在学习 垃圾收集器与内存分配策略 的基础知识: [1]垃圾回收概述 1)GC(Garbage Collection)需要完成的3件事情: ...

  7. 垃圾收集器与内存分配策略(五)之垃圾日志与常见参数

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集器与内存分配策略(五)--垃圾日志与常见参数 理解GC日志 每个收集器的日志格式都可以不一样,但各个每个收集器的日志都 ...

  8. 【深入理解Java虚拟机学习笔记】第三章 垃圾收集器与内存分配策略

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  9. java_opts gc回收器_jvm垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略: 以下参考周志明的<>. 判断对象是否存活: 引用计数:通过判断对象被引用的次数(为0,则表示不可被使用),但这很难解决对象相互循环引用的问题. 根搜索算法:即采 ...

  10. 7种垃圾收集器与内存分配策略,看这一篇就够了

    垃圾收集器与内存分配策略-垃圾收集器 (A).图中展示了7种不同分代的收集器: Serial.ParNew.Parallel Scavenge.Serial Old.Parallel Old.CMS. ...

最新文章

  1. 技术文章是怎样炼成的?
  2. BigData:绘制2018年福布斯中国富豪榜人根据出生地绘制个人或其家族财富分布热点图
  3. 分界符 EOF 不使用反斜杠转义的技巧
  4. Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件
  5. dao.php,DAO.php · Dodd/Training Lab - Gitee.com
  6. 融云发送图片消息_IM消息ID技术专题(五):开源分布式ID生成器UidGenerator的技术实现...
  7. Windows里Anaconda-Navigator无法打开(解决)
  8. html{-webkit-text-size-adjust:none;}(取消浏览器最小字体限制)
  9. 有效修改Tomcat6默认端口(ubuntu server,centos)
  10. OpenStack之化云为雨
  11. 并发编程常见面试题总结二
  12. iscsi 挂载教程_CentOS下如何搭建ISCSI以及Windows如何挂载ISCSI镜像
  13. lcd12864资料
  14. 深度学习一(PyTorch物体检测实战)
  15. UML统一建模语言习题一
  16. 层次分析法和bp神经网络,基于bp的神经网络算法
  17. ofo 成了一个披着「退押金」的电商导购平台?
  18. C#中的NewLine到底是什么字符?
  19. 《闻官军收河南河北》 杜甫
  20. C语言期末考试成绩奖励编码,C语言期末考试总结,看完保你过

热门文章

  1. Qt配置使用VS2010进行开发
  2. C# 插件构架实战(Jack H Hansen )
  3. 学习数学到底有什么用?
  4. swoole怎么做mysql连接池_Swoole4创建Mysql连接池
  5. mysql5.5编译安装_mysql5.5编译安装及配置
  6. PhpStorm无法获取Post数据 配置
  7. JMS学习(三)JMS 消息结构之属性及消息体详解
  8. iOS开发之Runloop(转)
  9. Java annotation 自定义注释@interface的用法 转载记录
  10. 思必驰重磅发布AI芯片,同时推出产业破局战略