1. 什么是垃圾

要回收垃圾,那么垃圾是什么?简单的逻辑就是不会再被使用的内存对象呗。

2. 怎么判断不再被使用

2.1 引用计数法。统计有多少个引用指向内存对象,如果没有引用指向内存对象,那么该内存对象可以被当做垃圾。但是这边有一个循环引用的问题,如一个方法内,创建了两个新节点,它们之间互相引用,最终方法执行结束,方法内引用的对象应该被回收,但如果使用引用计数方案来处理,由于节点有被引用,会造成无法回收。

2.2 可达性分析。如果一个对象和GC Roots之间没有链路连接,那么该对象可回收。但为了避免可达性分析过程中,其它用户线程更改对象引用关系,会有GC停顿操作,也就是暂停Java所有工作线程。各个线程通过主动式查询中断标志位,然后决定是否中断停在附近的安全点(方法调用、循环跳转这些具有让程序长时间执行的指令会产生安全点)。因为需要线程主动查询中断标志位,如果是那些睡眠或阻塞的线程,它们无法主动去查询中断标志位,因此它们会在进入睡眠或阻塞这些安全区域代码时,标识自己进入了安全区域。当虚拟机发起垃圾回收时不需要管进入安全区域的线程,如果这些线程在垃圾回收时结束了安全区域代码,那么会等待,直到JVM完成GC Roots枚举。

2.3 GC Roots对象。可作为GC Roots对象的有四类:①虚拟机栈中局部变量表引用的对象;②类静态属性引用的对象;③方法区中常量引用的对象;④本地方法栈(带有native修饰符的方法)中引用的对象。

3. 回收机制

确定了垃圾后,回收的机制:①如果“垃圾”对象没有重写finalize方法或者已经调用过finalize方法,那么该“垃圾”对象直接被回收;②如果“垃圾”对象重写了finalize方法并且还没有调用过finalize方法,那么会被放入F-Queue队列中;稍后虚拟机会创建Finalize线程并执行finalize方法,如果对象要“拯救”自己,那么只要在finalize方法中再和GC Roots引用链上任何一个对象连接上即可。如果对象这时候还没有逃脱,那么它就真的被回收了。

4. 回收方法区(也叫永久代)的废弃常量和无用的类

虽然虚拟机规范不要求对方法区进行垃圾回收,但还是可以对废弃常量和无用类进行回收。无用类的判断条件:①任何实例都被回收;②加载该类的ClassLoad也被回收;③该类对应的java.lang.Class对象没有在任何地方被引用。

浅谈Java虚拟机JVM的垃圾回收机制相关推荐

  1. 浅谈V8引擎中的垃圾回收机制

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  2. 《深入理解Java虚拟机》阅读——垃圾回收机制

    <深入理解Java虚拟机>阅读--垃圾回收机制 前言 why--为什么需要垃圾回收 what--垃圾回收做些什么 where--去哪里回收垃圾 how--垃圾回收是怎么做的 垃圾是否要回收 ...

  3. 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )

    文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...

  4. Java虚拟机(三)——初识JVM的垃圾回收机制

    前言 对于程序计数器.虚拟机栈.本地方法栈这三个部分而言,其生命周期与相关线程有关,随线程而生,随线程而灭.并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回 ...

  5. java虚拟机类加载机制浅谈_浅谈Java虚拟机(三)之类加载机制

    在<浅谈Java虚拟机>这篇文章中,我们提到了JVM从操作系统方面来说,可以将其看做是一个进程,分别有类加载器子系统,执行引擎子系统和垃圾收集子系统.这一篇文章就简单的来谈一下类加载器子系 ...

  6. java手动回收_浅谈java是如何做资源回收补救的

    学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...

  7. jvm垃圾回收机制_深入理解JVM的垃圾回收机制

    ​如何判断对象已"死" Java堆中存放着几乎所有的对象实例,垃圾回收器在堆进行垃圾回收前,首先要判断这些对象那些还存活,那些已经"死去".判断对象是否已&qu ...

  8. 细说JVM的垃圾回收机制

    什么是垃圾回收? 从字面看来,按字面意思来理解就是--找到垃圾对象并将他们抛弃掉:事实却正好相反,垃圾回收是把处于活动状态的对象找出来,而将剩余的对象标记为垃圾对象.基于此理论,我们来详细描述java ...

  9. 深入理解JVM虚拟机(二):垃圾回收机制

    谈起GC,应该是让Java程序员最激动的一项技术,我相信每个Java程序员都有探究GC本质的冲动!JVM垃圾回收机制对于了解对象的创建和对象的回收极为重要,是每个Java程序员必须掌握的技能. 本博客 ...

最新文章

  1. Panabit 安装笔记之FreeBsd 6.2的安装
  2. 【Deep Learning笔记】用Inception-V3模型进行图像分类
  3. 使用CLI设置WildFly绑定地址并关闭
  4. 排序算法的总结——Java实现
  5. MySQL字符串替换
  6. C/C++三个标准设备文件句柄
  7. 乔布斯的这 3 个故事依然激励着我
  8. GitHub 项目精选(2022.5.18更新)
  9. keil C51代码优化等级介绍
  10. 微信开发者工具 公众号网页调试的调试器没了?
  11. 中文信息杂志中文信息杂志社中文信息编辑部2022年第6期目录
  12. 分享NetSuite CRM成功实施案例!
  13. 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛 B - 大还是小? 字符串水题...
  14. opencv证件照变更任意底色
  15. 我使用的安卓软件名单_我是亲民_新浪博客
  16. Opencv 笔记7 凸包算法-Graham扫描法
  17. JS-事件-写一个通用的事件监听函数
  18. SQL调优指南笔记9:Joins
  19. Sencha Touch中 xclass和xtype区别
  20. 10-252 B1-6统计客户的订单信息

热门文章

  1. 【转】SAP PS 模块简介
  2. 采购订单相关Table
  3. SAP删除会计科目 OBR2
  4. SAP中关于物料主数据里物料类型的修改
  5. 疫情过后,2020年各省市GDP排行榜top10新鲜出炉,你的家乡排在第几?
  6. oracle 00980,ORA-00980如何解决
  7. php分页怎么实行跳转,php分页函数,支持页码下拉选择跳转
  8. java课程设计 成绩_java课程设计 学生成绩管理
  9. mysql 允许远程_配置mysql允许远程连接的方法
  10. 操作系统页面置换算法实验报告