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++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
随机推荐
- C#Doc写入 XML文件
HTML是XML的先驱,XML延续了HTML的简单性的优点.XML不是用来替代HTML的, XML和HTML为不同的目的而设计: XML被设计用来描述数据,其焦点是数据的内容.HTML被设计用来显示数 ...
- [uwp]自定义Behavior之随意拖动
由于最近有需求,所以自定义了一个随意拖动元素的Behavior. 当然在使用这个自定义的Behavior时,有个小假设:拖动元素必须是Canvas容器的子元素. 实现原理比较简单低效: 监听被拖动元素 ...
- Android ScrollView 去掉 scrollbar 和 阴影
1. 在 layout 里: android:scrollbars="none" android:overScrollMode="never" 2. 代码里 / ...
- python中的内置函数,递归,递归文件显示(二),二分法
1.部分内置函数 repr()显示出字符串的官方表示形式,返回一个对象的string形式 # repr 就是原封不动的输出, 引号和转义字符都不起作用 print(repr('大家好,\n \t我叫周 ...
- 516. Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- B - Bridging signals (LIS)
点击打开链接 B - Bridging signals 'Oh no, they've done it again', cries the chief designer at the Waferlan ...
- robot framework接口测试之二-四种常见的POST提交数据方式
写接口测试用例时,遇到以json格式提交数据时,报错,Request如下图: Response如下图: 改成form格式提交,可以正常运行,如下图: 代码如下: ------------------- ...
- idea部署tomcat:tomee required to support ear/ejb de。。
要确定artifact 的type是使用的web application :exploded类型,使用javaee application :exploded就会报这个错误.
- eclipse安装SonarLint插件,sonarLint客户端的使用
一.在线安装sonarLint 打开eclipse里的help->Eclipse Marketplace,搜索“sonar”关键字,目前sonar的插件是sonarlint,如下图: 点击“In ...
- python3.6使用scrapy报错
用python做爬虫的,肯定熟悉scrapy,不过新手安装总是会遇到各种奇葩错误. 错误一:building 'twisted.test.raiser' extensionerror: Microso ...