浅谈Java虚拟机JVM的垃圾回收机制
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的垃圾回收机制相关推荐
- 浅谈V8引擎中的垃圾回收机制
浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...
- 《深入理解Java虚拟机》阅读——垃圾回收机制
<深入理解Java虚拟机>阅读--垃圾回收机制 前言 why--为什么需要垃圾回收 what--垃圾回收做些什么 where--去哪里回收垃圾 how--垃圾回收是怎么做的 垃圾是否要回收 ...
- 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )
文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...
- Java虚拟机(三)——初识JVM的垃圾回收机制
前言 对于程序计数器.虚拟机栈.本地方法栈这三个部分而言,其生命周期与相关线程有关,随线程而生,随线程而灭.并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回 ...
- java虚拟机类加载机制浅谈_浅谈Java虚拟机(三)之类加载机制
在<浅谈Java虚拟机>这篇文章中,我们提到了JVM从操作系统方面来说,可以将其看做是一个进程,分别有类加载器子系统,执行引擎子系统和垃圾收集子系统.这一篇文章就简单的来谈一下类加载器子系 ...
- java手动回收_浅谈java是如何做资源回收补救的
学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...
- jvm垃圾回收机制_深入理解JVM的垃圾回收机制
如何判断对象已"死" Java堆中存放着几乎所有的对象实例,垃圾回收器在堆进行垃圾回收前,首先要判断这些对象那些还存活,那些已经"死去".判断对象是否已&qu ...
- 细说JVM的垃圾回收机制
什么是垃圾回收? 从字面看来,按字面意思来理解就是--找到垃圾对象并将他们抛弃掉:事实却正好相反,垃圾回收是把处于活动状态的对象找出来,而将剩余的对象标记为垃圾对象.基于此理论,我们来详细描述java ...
- 深入理解JVM虚拟机(二):垃圾回收机制
谈起GC,应该是让Java程序员最激动的一项技术,我相信每个Java程序员都有探究GC本质的冲动!JVM垃圾回收机制对于了解对象的创建和对象的回收极为重要,是每个Java程序员必须掌握的技能. 本博客 ...
最新文章
- Panabit 安装笔记之FreeBsd 6.2的安装
- 【Deep Learning笔记】用Inception-V3模型进行图像分类
- 使用CLI设置WildFly绑定地址并关闭
- 排序算法的总结——Java实现
- MySQL字符串替换
- C/C++三个标准设备文件句柄
- 乔布斯的这 3 个故事依然激励着我
- GitHub 项目精选(2022.5.18更新)
- keil C51代码优化等级介绍
- 微信开发者工具 公众号网页调试的调试器没了?
- 中文信息杂志中文信息杂志社中文信息编辑部2022年第6期目录
- 分享NetSuite CRM成功实施案例!
- 第十一届“蓝狐网络杯”湖南省大学生计算机程序设计竞赛 B - 大还是小? 字符串水题...
- opencv证件照变更任意底色
- 我使用的安卓软件名单_我是亲民_新浪博客
- Opencv 笔记7 凸包算法-Graham扫描法
- JS-事件-写一个通用的事件监听函数
- SQL调优指南笔记9:Joins
- Sencha Touch中 xclass和xtype区别
- 10-252 B1-6统计客户的订单信息