GC回收垃圾对象过程
GC回收垃圾对象需要完成的三件事
1、哪些内存需要回收?
2、如何判断对象是否该回收?
3、如何回收垃圾对象?
哪些内存需要回收
程序计数器、虚拟机栈、本地方法栈三个区域随线程而生随线程而灭。虚拟机栈中的栈帧随着方法的开始和结束对应着入栈和出栈。每一个栈帧需分配内存的大小在类结构确定下来时就已知了。因此这几个区域的内存分配和回收都具有确定性。方法结束时或是线程结束时内存会随之回收。
Java堆和方法区不同,一个接口的实现类所需的内存可能不同,一个方法的不同分支所需内存也可能不同。只有在程序运行期才能知道要创建多少对象,这部分的内存分配和回收具有动态性。
如何判断对象是否该回收
引用计数算法
给对象添加一个引用计数器,每当有一个地方引用该对象时计数器加1,有一个地方的引用失效时计数器减1,计数器为0的对象判定为不可用。但是主流的虚拟机没有选用该算法原因是无法解决对象之间互相循环引用的问题。
可达性分析算法
该算法思路是通过一系列称为"GC Roots "的对象作为起始点开始向下搜索,搜索走过的路径称为引用链(Reference Chain)。当一个对象到GC Roots没有任何引用链相连接时则证明此对象不可用。
虽然5、6、7对象互相引用,但是他们到GC Roots是不可达的,他们将被判定为可回收的对象。
可作为GC Roots的对象
虚拟机栈(栈帧中的本地变量表)中引用的对象
方法区中静态属性引用的对象
方法区中常量引用的对象
本地方法栈(Native方法)中引用的对象
对象引用
强引用
该引用普遍存在如Object obj = new Object();,只要强引用还存在垃圾收集器将不能回收掉被引用的对象。
软引用
该引用描述的是还有用但是非必须的对象。对于软引用着的对象在系统发生内存溢出异常之前会回收该对象,如果内存不够才会抛出内存溢出异常。SoftReference类实现软引用。
弱引用
该引用描述非必须的对象。对于弱引用着的对象只能存活到下一次垃圾收集器触发之前,无论内存是否足够都会回收该对象。WeakReference类实现弱引用。
虚引用
该引用不会对对象的生存时间产生影响而且我们无法通过该引用获得对象实例。唯一的作用是当对象被回收时收到一个系统通知。PhantomReference类实现虚引用。
回收方法区
方法区的垃圾收集行为比较少,主要是收集废弃常量和无用的类。
废弃常量容易判定,无用的类需满足三个条件才能判定类是无用的
该类的所有实例已被回收,堆中没有类的任何实例
加载该类的类加载器已经被回收
该类的java.lang.Class对象没有在任何地方被引用,在任何地方无法通过反射访问其方法
在大量使用反射、动态代理的框架、动态生成JSP及OSGI这类频繁自定义ClassLoader的场景都需要虚拟机有类卸载功能保证方法区不会溢出
如何回收垃圾对象 (垃圾收集算法)
标记-清除算法
首先标记要回收的对象,标记完成后统一回收所有被标记的对象。不足是标记和清除效率都不高,标记清除后产生不连续的空间碎片。
复制算法
将可用内存划分为大小相等的两块,每次只用其中一块,用完之后将活着的对象复制到另一块上,然后将用过的那块一次性清除。当前虚拟机对新生代都使用该算法,将内存分为一个块较大的Eden和两块较小的Survivor空间,每次使用一块Eden和一块Survivor,回收时将存活的对象复制到另一块Survivor中。当Survivor空间不足时依赖其他内存(老年代)进行分配担保。
标记-整理算法
标记和标记-清除算法算法一样,接下来不是直接对可回收的对象进行回收,而是让所有的存活对象向一段移动,然后清除掉端边界外的内存。
分代收集算法
当前虚拟机都采用该算法,将Java堆分为新生代和老年代。新生代中每次GC时都会有大量对象死去,少部分存活选用复制算法。老年代对象存活率较高,没有额外内存进行分配担保必须使用标记-清除或标记-整理算法。
转载于:https://www.cnblogs.com/BINGJJFLY/p/7610684.html
GC回收垃圾对象过程相关推荐
- java 强制gc_如何强制GC回收垃圾
Java垃圾回收机制(GC)详解 简介: 垃圾回收GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内 ...
- Java中的垃圾回收与对象生命周期
转载自 Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...
- java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)
1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...
- 内存代管理器TenuredGeneration对垃圾对象的回收
内存代管理器TenuredGeneration作为基于内存分代管理的内存堆管理器GenCollectedHeap默认的旧生代管理器,它对垃圾对象的回收算法要比年青代Gc要复杂的多,但其主体思路就是:标 ...
- Java GC如何判断对象是否为垃圾
查找内存中不再使用的对象 引用计数法 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾.这种方法的缺点就是不能检测到环的存在. 2.根搜索算法 根搜索算法的基本思路就是通过一系列名为&qu ...
- JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】
文章目录 思维导图 概述 如何判断对象为垃圾对象 对象的存活还是死亡 判断对象死亡的算法一:引用计数算法Reference Counting 原理 示意图 优点 缺点 实验 判断对象死亡的算法一:可达 ...
- java对象gc恢复_JVM垃圾回收与对象状态
看到JVM就不得不说垃圾回收,说到垃圾回收(Garbage Collection,GC),顾名思义,垃圾回收就是释放垃圾占用的空间,在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切 ...
- GC:垃圾回收机制及算法
GC:垃圾回收机制及算法 关键词 算法:标记(清除/复制/整理).分代收集 收集器(Serial[串行].ParNew[并行].Parallel Scavenge[并行].Serial Old[串行] ...
- JVM GC(垃圾回收机制)
在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当st ...
最新文章
- 使用postman传递参数时报错:Content type ‘multipart/form-data;boundary=--(略)
- C#将内容导出到Word到指定模板
- elementui :on-remove怎么用_Vue + Vuex + Element UI实现动态全局主题颜色
- Linux(CentOS)中常用软件安装,使用及异常——XManager, 中文支持,JDK
- BFS HDOJ 1242 Rescue
- python中debug有什么用途_Python debug 总结
- 安卓学习笔记10:常用布局 - 相对布局
- kafka内部消费偏移
- C语言堆栈入门 —— 堆和栈的区别
- 【Intellij-IDEA系列】IDEA右键没有Git或svn处理方法
- 运维安全加固规范_DBA如何巧用“三十六计”保障数据库安全?
- 【面向对象设计原则】之依赖倒置原则(DIP)
- pycharm设置python环境_pycharm怎么配置python环境
- 大数据笔记--Spark机器学习(第一篇)
- coupon优惠券 -- CSS样式
- linux opensource,GitHub - opensourceteams/linux: linux命令
- python访问纯真IP数据库的代码
- 金河电站被困216小时女工获救生还记
- node.js+uniapp计算机毕业设计安卓在线民宿预定app(程序+APP+LW)
- docker镜像编译与docker-compose部署与编排
热门文章
- 第三章 线性表---顺序存储结构
- Bootstrap简介及Bootstrap里的栅格系统col-md/sm/xs-x;
- webservice jsonp格式调用
- BIND_MISMATCH导致过多VERSION COUNT的问题
- 数学之美 系列十六 (下)- 不要把所有的鸡蛋放在一个篮子里 最大熵模型...
- linux下多版本gcc编译器管理方法
- nginx+php+memcache高速缓存openresty)
- 跨站请求伪造攻击(CSRF)
- AIRec个性化推荐召回模型调参实战
- 深入浅出讲解MSE Nacos 2.0新特性