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堆

③空间整合

从整体上来看属于标记-整理算法,从局部看属于复制算法,不会产生内存碎片

④可预测停顿

 

转载于:https://www.cnblogs.com/CLAYJJ/p/8253848.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机增加内存方法

楼主由于要在虚拟机里面装一个oracle,在安装过程中,提示物理内存不符合最低标准,如图1. 图1 因为懒得新建一个虚拟机了,所以考虑给虚拟机新增磁盘空间。 首先说明,新增磁盘空间,必须保证当前虚拟机里每个新…

myBatis xml if、where、if-else?、foreach 心得

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这…

bzoj千题计划213:bzoj2660: [Beijing wc2012]最多的方案

http://www.lydsy.com/JudgeOnline/problem.php?id2660 很容易想到是先把n表示成最大的两个斐波那契数相加,然后再拆分这两个斐波那契数 把数表示成斐波那契进制的形式,第i位表示有没有第i个斐波那契数 比如16133 001001 那么拆分一个数就是把一个1…

面对对象-封装

private 私有的 package/friendly/default 不写 protected 受保护的 public 公共的 那么什么情况该用什么修饰符呢?从作用域来看,public能够适用所有的情况。 但是大家在工作的时候,又不会真正全部都适用public,那么到底什么情况改用什么修饰…

本文详解5G是个什么鬼,程序员都准备好了吗?

无线移动通讯发展历史 最近5G的概念炒的如火如荼,为此,华为和高通还干了一仗。这篇文章从技术层面给大家分析,什么是5G,它和4G比,高级在哪里? 我们来看看移动互联网的技术发展: 然后我们在来看看…

安装kerberos报错 error: command 'gcc' failed with exit status 1

pip install kerberos 报错:error: command gcc failed with exit status 1 安装环境工具 yum install gcc libffi-devel python-devel openssl-devel 再次安装kerberos安装成功 转载于:https://www.cnblogs.com/panbc/p/8268574.html

jquery正则表达式验证:验证全是数字

需求说明: 前端页面使用正则表达式验证输入框中输入的内容全是数字。 代码说明: 这里只介绍正则表达式,其他部分的代码不做介绍。如果有其他需要自行修改即可。 步骤一:建立一个页面可以是html、jsp等,引入jquery-3.2.…

0613课堂汇总

一: 数据类型: 基本数据类型{byte(8)/short(16)/char(16)/int(32)/float(32)/long(64)/double(64)/boolean(1)}引用数据类型{*除了基本数据类型都是引用数据类型 *包括API中的类(String,File)*自定义的类(Personal A…

Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...

Istio Gateway提供多个自定义入口网关的支持能力,通过开放一系列端口用于承载网格边缘的进入连接,同时可以使用不同loadbalancer来隔离不同的入口流量。cert-manager可用于使用存储在Kubernetes Secret资源中的任意签名密钥对来获取证书。本文提供了手动…

log4配置

log4j 和 log4j2 方式一&#xff1a;log4j2.xml 添加 jar 包 1 <!-- log4j-core --> 2 <!-- 3 <dependency> 4 <groupId>org.apache.logging.log4j</groupId> 5 <artifactId>log4j-core</artifactId> 6 …

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)

3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我们的小朋友很喜欢计算机科学&#xff0c;而且尤其喜欢二叉树。考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n]。…

常用内建模块

一.datetime 1.模块导入: from datetime import datetime 2.获取当前日期和时间: >>> now datetime.now() >>> print(now) 2019-01-13 14:19:38.1810003.获取指定日期和时间: >>> dt datetime(2019,1,10,15,0) >>> print(dt) 2019-01-10…

子序列进阶问题

题目&#xff1a; 有一个数组&#xff0c;让找到两个不重复的连续子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定连续&#xff0c;设两端连接处index为{X&#xff0c;x1}&#xff0c;X可取0~n-1 设F(x)为连接处index为{X&#xff0c;x1}时 Max(Sum(A)…

day5-shelve模块

一、概述前面章节我们讲述了json和pickle模块的序列化和反序列化处理&#xff0c;他们有一个不足是在python 3中不能多次dump和load&#xff0c;shelve模块则可以规避这个问题。shelve模块是一个简单的k,v将内存数据通过文件持久化的模块&#xff0c;可以持久化任何pickle可支持…

程序员:请你不要对业务「置之不理」

成长是条孤独的路&#xff0c;一个人会走得更快&#xff1b;有志同道合者同行&#xff0c;会走得更远。本篇内容整理自 21 天鲲鹏新青年计划线上分享内容。鲲鹏新青年计划是由 TGO 鲲鹏会组织的线上分享活动&#xff0c;希望能帮助更多同学一起学习、成长。12 月 28 日&#xf…

在Ubuntu系统下如何将chrome浏览器的bookmarks导出到本地

1. 打开chrome浏览器在页面的右上角点击那个三个小点的位置&#xff0c;找到bookmarks&#xff0c;然后点击bookmarks manager,然后在organize右侧大倒三角下选择&#xff0c;export bookmarks to HTML&#xff0c;选择要保存的位置&#xff0c;利用同样的方法下次就可以直接导…

php基于数组的分页实现

关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页&#xff0c;函数show_array用于分页函数的操作及显示&#xff0c;需要配合使用.两个函数通过全局变量$countpa…

028 -bash-4.1$ 出现故障的原理及解决办法?

最近在搭建分布式的时候&#xff0c;出现了这个问题&#xff0c;很不爽。下面是我的解决方式。 1.在用户下删除bash rm -rf /home/beifeng/.bash* 2.拷贝 cp /etc/skel/.bash* /home/beifeng 3.退出&#xff0c;再进入用户 4.解释 set |grep -i ps1 转载于:https://www.cnblogs…

弹出ifream

top.$.jBox("iframe:"${ctx}/synopsis/hmlwxSynopsis/addItem, {title: "添加作品",width: 1000, height: 500, buttons:{关闭: true,确定:ok},submit:function(v, h, f){},loaded: function (jboxContent) {$(jboxContent).css(overflow-x,);$(jboxConten…

ORB-SLAM2中的Loop Closinng中DetectLoopCandidates函数解析

/函数的三要素是&#xff1a;函数返回值类型&#xff0c;函数名称&#xff0c;函数参数 函数的返回值是装有关键帧指针的vector 该函数是类KeyFrameDatabase的成员函数,函数名是DetectLoopCandidate 该函数的参数分别是KeyFrame类型的指针变量 pKF和最小得分vector<KeyFrame…