JVM垃圾回收机制总结
对于垃圾回收机制我先抛出三个问题:
①哪些内存需要回收?
②什么时候回收?
③如何回收?
下面我们主要针对这三个问题来研究JVM GC
一、哪些内存需要回收?
1.JAVA使用可达性分析法来判断对象是否需要回收。
这个算法的基本思路是通过一系列称为“GC ROOTS”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC ROOTS没有任何引用链的话,则此对象不可用。可回收。
GC ROOTS对象包括以下几种:
①虚拟机栈(栈帧中的本地变量表)中引用的对象
②方法区中类静态属性引用的对象
③方法区中常量引用的对象
④本地方法栈JNI引用的对象
2.对象在作可达性分析后如果没有与任何GC ROOTS关联那么将会被标记筛选,如果它覆盖了finalize()方法则它将会被放置在一个F-Queue队列中,并由一个Finalizer线程去执行,如果在finalize方法中成功拯救了自己(将this引用赋值给每个类变量或者成员变量),则可避免被回收。但是强烈不建议使用对象的finalize()方法。在这里我只是把我知道的记录一下。
二、什么时候回收?
1.安全点
程序在执行时并不是在所有地方都能停下来进行GC,只有到达安全点才能暂停。对于Safepoint,需要考虑的问题是如何在GC发生时让所有线程都跑到最近的安全点再停顿下来。这里有两种方案可选:
①抢占式中断
抢占式中断不需要线程的执行代码主动去配合,在GC发生时,首先把所有线程全部中断,如果发现线程中断的地方不在安全点上,就恢复线程,让它跑到安全点上。
②主动式中断
主动式中断不直接对线程操作,仅仅设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时就自己中断挂起,轮询标志和安全点是重合的,另外加上创建对象需要分配内存的地方。
2.安全区域
安全区域是指在一段代码中,引用关系不会发生变化,在这个区域的任何地方开始GC都是安全的。
线程执行到safe region中的代码时,首先标识自己进入safe region,那在这段时间里JVM要发起GC时就不用管那些已经标识自己为safe region状态的线程了。当线程要离开safe region时,检查系统是否已经完成了根节点枚举,如果完成了,那线程就继续执行否则就等待直到可以离开safe region的信号为止。
三、如何回收?
1.回收算法:
1)标记-清除算法
缺点:①效率问题,标记和清除两个过程的效率都不高;②空间问题,清除后会产生大量不连续的内存碎片,导致大对象无法分配而提前出发GC
2)复制算法
复制算法是将内存分为大小相等的两块,每次只是使用其中的一块。当一块内存使用完之后,将还存活的对象复制到另一块内存中,然后清空内存。
缺点:内存容量只使用了一半。
现在的商业虚拟机都采用这种方式来回收新生代。使用一块eden和两块survivor区,eden:survivor=8:1,每次只使用eden和一块survivor,然后将存活对象复制到另一块survivor上。
注意,这里我们不能保证每次回收都只有不多于10%的对象存活,当survivor空间不够时需要依赖其他内存(老年代)进行分配担保。
3)标记-整理算法
标记过程与标记-清除算法相同,后续不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存
4)分代收集算法
针对不同的内存区域采用不同的回收算法,比如年轻代采用复制算法,老年代采用标记-清除或者标记-整理算法。
四、垃圾回收器
1.serial收集器
单线程收集器,年轻代采用复制收集算法,老年代采用标记-整理算法
2.ParNew收集器
是Serial收集器的多线程版本
3.Parallel Scavenge收集器
采用复制算法的多线程新生代收集器,与ParNew不同的是,其目的是达到一个可控制的吞吐量。(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))
4.Parallel Old收集器
Parallel Scavenge的老年代版本。
5.CMS收集器
以获取最短回收时间为目标的收集器,基于标记-清除算法
6.G1收集器
特点:
①并行与并发
②分代收集
G1不需要与其他收集器配合,管理整个GC堆
③空间整合
从整体上来看属于标记-整理算法,从局部看属于复制算法,不会产生内存碎片
④可预测停顿
JVM垃圾回收机制总结的更多相关文章
- JVM垃圾回收机制总结:调优方法
转载: JVM垃圾回收机制总结:调优方法 JVM 优化经验总结 JVM 垃圾回收器工作原理及使用实例介绍
- JVM内存管理和JVM垃圾回收机制
JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...
- JVM垃圾回收机制概述
JVM垃圾回收机制概述 1.定义 是指JVM用于释放那些不再使用的对象所占用的内存. 2.方式 2.1引用计数(早期) 当引用程序创建引用以及引用超出范围时,JVM必须适当增减引用数.当某个对象的引用 ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- JVM基础系列第8讲:JVM 垃圾回收机制
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- JVM垃圾回收机制和常用算法
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...
- 真的可惜,四面阿里,结果我被JVM垃圾回收机制与 OOM异常卡住了
前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...
- java JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
随机推荐
- ASP.NET Core学习指导
ASP.NET Core 学习指导 "工欲善其事必先利其器".我们在做事情之前,总应该做好充分的准备,熟悉自己的工具.就像玩游戏有一些最低配置一样,学习一个新的框架,也需要有一些基 ...
- 使用ssm实现校验密码
由于审题不清,在完成作业“servlet实现进行用户名和密码验证”中使用了jdbc连接数据库的方式实现,没用静态方式验证,故本次作业使用ssm实现 本次作业上传到百度网盘:链接:https://pan ...
- RabbitMq初探——消息确认
消息确认机制 前言 消息队列的下游,业务逻辑可能复杂,处理任务可能花费很长时间.若在一条消息到达它的下游,任务刚处理了一半,由于不确定因素,下游的任务处理进程 被kill掉啦,导致任务无法执行完成.而 ...
- web负载均衡【总结归纳所有看过的资料的理论】
web负载均衡 在有些时候进行扩展是显而易见的,比如下载服务由于带宽不足而必须进行的扩展,但是,另一些时候,很多人一看到站点性能不尽如人意,就马上实施负载均衡等扩展手段,真的需要这样做吗?当然这个问题 ...
- | 与|| ,& 与&&
& 既是位运算符又是逻辑运算符,&的两侧可以是int,也可以是boolean表达式 举例:12&5 的值是多少?答:12转成二进制数是1100(前四位省略了),5转成二进制数是 ...
- 第八届蓝桥杯JavaB---承压计算
标题:承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同. 金属材料被严格地堆放成金字塔形. 7 5 8 7 8 8 9 2 7 2 8 1 ...
- [Virtualization] VMware虚拟机三种网络模式详解(转)
原文:http://www.linuxidc.com/Linux/2016-09/135521.htm
- Leetcode 98 验证二叉搜索树 Python实现
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...
- UVA10140 Prime Distance
UVA10140 Prime Distance 给定两个整数L,R(1<=L<=R<=2^{31},R-L<=10^6)L,R(1<=L<=R<=231,R− ...
- SDN定义网络
http://edu.51cto.com/course/course_id-4466.html http://edu.51cto.com/course/course_id-4497.html