当前位置: 首页 > 编程日记 > 正文

深入理解JVM——虚拟机GC

对象是否存活

Java的GC基于可达性分析算法(Python用引用计数法),通过可达性分析来判定对象是否存活。这个算法的基本思想是通过一系列"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时(图论称之为不可达),则证明此对象是不可用的。

无论引用计数法,还是可达性分析都离不开“引用”的概念。Java将引用分为四种(强引用、软引用,弱引用,虚引用),这四种引用强度依次逐渐减弱。

strong reference强引用,垃圾收集器永远不会回收存在强引用的对象。(如Object obj = new object()就是一个强引用)

soft reference软引用,描述一些还有用但是并非必须的对象。系统将要发生内存溢出异常之前,将会把这些软引用对象列入回收范围中进行二次回收。如果这次回收之后还是不够内存,才会抛出内存溢出异常。

weak reference弱引用,也是用来描述非必须对象的,但是它的强度更弱。被弱引用的对象只能活到下一次GC发生之前。当GC发生,无论当前内存是否充足都会回收弱引用对象。

phantom reference虚引用(幽灵引用),是最弱的一种引用关系。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

在可达性算法中不可达的对象,不会直接死亡,如果它还没有执行finalize方法,虚拟机将在一个优先级很低的线程中触发它的finalize方法(不保证完成),如果此时对象又将自己关联到引用链上,那么GC将把它移出“即将回收”的集合。

由于finalize方法只会被执行一次,所以这个“自救”过程也只会经历一次。

垃圾回收方法

1、标记清除法

首先标记所有需要回收的对象,然后统一回收所有要回收的对象。方法简单,但是效率不高,并且产生了很多内存碎片。

2、复制算法

将内存分为大小相等的两块,每次只使用一块。当一块的内存用完了,就将还存活的对象复制到另一块内存上,然后把使用过的那一半内存空间一次性清理掉。这样再分配内存时只需要移动堆顶指针,实现简单,运行高效。但是代价是实际可用内存缩小了一半,实在太高。

因为新生代大部分对象都是”朝生夕死“,所以虚拟机将内存分为1个Eden和2个Survivor空间,大小比例默认为8:1:1。当回收时,将Eden和Survivor中还存活着的对象复制到另一个Survivor空间上,然后清理掉Eden和刚才用过的Survivor空间。这样子就只需要牺牲10%的新生代内存。

分配担保:因为存在1个Survivor空间存放不了Eden和另一个Survivor空间的对象的情况,此时那些存活的对象由于无法放入该Survivor空间,将直接进入老年代。)

3、标记-整理算法

老年代对象存活率高,复制算法在这时候效率很低,而且老年代没有额外空间做分配担保,所以不适用。根据这种特点,有人提出了标记-整理算法。

首先标记所有要回收的对象,然后所有存活的对象都向一端移动,然后直接清理边界以外的内存。

4、分代收集算法

前面三个垃圾回收算法都算是铺垫,现在商业虚拟机的垃圾收集都采用”分代收集“。将Java堆分成新生代和老年代,新生代中每次GC有大量对象死去,只有少量存活,所以采用复制算法;老年代中对象存活率高,没有额外空间进行分配担保,就采用标记-清除或者标记-整理算法。

垃圾收集器

新生代:serial收集器

单线程,必须暂停其他所有工作线程(Stop The World),直到它收集结束。STW难以接受,但是简单高效。

新生代:parNew收集器

serial的多线程版本。server模式下首选,因为它可以和cms配合使用。

新生代:parallel scavenge收集器

专注于达到可控制吞吐量的收集器,主要适合后台运算而不用太多交互的任务。

老年代:serial old收集器

serial的老年代版本,单线程。使用标记-整理算法。

老年代:parallel old收集器

parallel scavenge的老年代版本。使用标记-整理算法。

老年代:cms收集器

经历四个阶段:

初始标记:需要STW,仅仅标记一下GC Roots能直接关联的对象,所以很快。

并发标记:进行GC Roots Tracing

重新标记:需要STW,修正并发标记期间因程序运行导致标记产生变动的那一部分对象的标记记录,时间比初始标记长,但是远比并发标记短

并发清除:清除对象

由于耗时最长的并发标记和并发清除过程,收集器线程都可以和用户线程一起工作,所以总体来说cms收集器的内存回收过程是和用户线程一起并发执行的,停顿很短。

缺点:cpu资源敏感,特别是cpu核数较少时;无法处理浮动垃圾;cms基于标记-清除算法,容易产生大量内存碎片。

G1收集器

最新的收集器,性能优秀,但是太复杂不再赘述。

内存分配和回收策略

对象优先在Eden分配,如果启动了TLAB,将按照线程优先在TLAB上分配。

当Eden不够空间时,虚拟机发起一次Minor GC(新生代GC)

大对象直接进入老年代

长期存活的对象将进入老年代(存活一次GC age+1,默认age 15时进入老年代)

Survivor空间中相同年龄所有年龄大小 的总和大于Survivor空间的一半 时,年龄大于等于该年龄的对象可以直接进入老年代

Minor GC时,虚拟机会检查老年代的剩余空间是否大于新生代对象总大小or历次晋升的平均大小,如果是那么就会进行Minor GC,否则认为老年代无法提供分配担保,进行Full GC。

欢迎工作一到八年的Java工程师朋友们加入Java高级交流群:828697593

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

哦对了,喜欢就别忘了关注一下哦~

转载于:https://juejin.im/post/5c0cd1bc518825501076b518

相关文章:

​2019年最新华为、BAT、美团、头条、滴滴面试题目及答案汇总

作者 | 苏克1900来源 | 高级农民工(ID:Mocun6)【导语】最近 GitHub 上一个库火了,总结了 阿里、腾讯、百度、美团、头条等国内主流大厂的技术面试题目,目前 Star 2000,还在持续更新中,预计会火下…

华胜天成ivcs云系统初体验2

重启完成以后,就看到传统的linux init3级别的登录界面。输入用户名root 密码:123456 (默认)接下来的工作是配置一些东西,让它跑起来。首先,要修改IP地址,还有机器名。输入命令:ivcs…

OpenCV中响应鼠标信息cvSetMouseCallback函数的使用

转自&#xff1a;http://blog.csdn.net/haihong84/article/details/6599838 程序代碼如下&#xff1a; #include <cv.h> #include <highgui.h> #include <stdio.h void onMouse(int event,int x,int y,int flags,void* param ); int main(int argc, char** …

日常遇到的一些问题或知识的笔记(一)

1、坑爹的sessionStorage 一直以为sessionStorage、localStorage跟cookie一样&#xff0c;只要存在&#xff0c;整个域名下都可见&#xff0c;直到新开了一个窗口tab页&#xff0c;惊奇的发现下面的sessionStorage丢失了&#xff01; Web Storage 包含如下两种机制&#xff1a;…

你是“10倍工程师”吗?这个事,​国外小伙伴们都快“吵”起来了

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】近日&#xff0c;推特上一个话题“10x工程师”异常火爆&#xff0c;引发的热议经久不散。这个话题由一位印度初创公司投资人 Shekhar Kirani 的一条推特引发&#xff0c;他写道&#xff1b;“如果…

运动目标跟踪__kalman

转自&#xff1a;http://blog.csdn.net/lindazhou2005/article/details/1534234 1、 什么是卡尔曼滤波器&#xff08;What is the Kalman Filter?&#xff09; 在学习卡尔曼滤波器之前&#xff0c;首先看看为什么叫“卡尔曼”。跟其他著名的理论&#xff08;例如傅立叶变换&a…

Spring工厂常识

环境搭建导入Sring对应的jar包导入Spring依赖的commons-loggin包导入log4j.properties在src下导入ApplicationContext.xml在任意目录下是一个轻量级的企业开发框架核心:IOC , AOP编程IOC:也就是inverse of control 控制反转 就是讲创建对象的权利转移到工厂中,从而实现解耦合和…

iframe子页面操作父页面

2019独角兽企业重金招聘Python工程师标准>>> 最近经常用到iframe&#xff0c;用的最多的就是在子页面中操作父页面的方法或变量等&#xff0c;总结了用到的几种方法&#xff0c;如下&#xff1a; var tableName window.parent.frames["mainFrame"].tNam…

ASP.NET MVC动作过滤器

ASP.NET MVC中包含以下4种不同类型的Action Filter&#xff1a; 类型使用时机接口实现方法授权过滤器(Authorization Filter)在执行任何Filter或Action之前被执行&#xff0c;用于进行身份验证IAuthorizationFilterAuthorizeAttribute动作过滤器(Action Filter)在执行Action之前…

什么限制了GNN的能力?首篇探究GNN普适性与局限性的论文出炉!

作者 | Andreas Loukas译者 | 凯隐责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】GNN是目前机器学习领域的热门网络之一&#xff0c;肯多研究与技术分享相比不可知的深度学习网络模型&#xff0c;GNN 有哪些吸引我们的优势及硬核实力。然而&…

OpenCV运动检测跟踪(blob track)框架组成模块详解

在..\opencv\doc\vidsurv文件夹中有三个doc文件&#xff0c;Blob_Tracking_Modules、Blob_Tracking_Tests、TestSeq&#xff0c;其中Blob_Tracking_Modules必须需要详读的。 “FG/BG Detection” module performsforeground/background segmentation for each pixel. “Blob E…

vi和软件安装

一 vi编辑器简介 vim 全屏幕纯文本编辑器 二 vim使用 1 vi 模式 vi 文件名 命令模式 输入模式 末行模式 命令----》输入 a&#xff1a;追加 i&#xff1a;插入 o&#xff1a;打开 i 命令----》末行 :w 保存 :q 不保存退出 2 命令模式操作 1&#xff09;…

鸟哥学习笔记---网络安全基础

yum clean [packages|header|all] packages:将已下载的软件文件删除 headers&#xff1a;将下载的软件文件头删除 all:将所有容器数据都删除 添加镜像站点&#xff1a;mirrorlisthttp://ftp.twaren.net/Linux/CentOS/6/os/x86_64/ http://free.nchc.org.tw/drbl-core/i386/RPMS…

使用纯C++实现SQL Server2005 数据库读写操作详细步骤

环境&#xff1a;虚拟机windows xp&#xff0c;vs2008 SQLServer 2005 Express 数据库访问技术采用ADO。 需要安装的软件包括&#xff1a;microsoft_dotnetfxchs2.0.exe、WindowsInstaller-KB893803-v2-x86.exe、SQLEXPR32_CHS.EXE、SQLServer2005_SSMSEE.msi、SQLServer200…

硬核吃瓜!上万条数据撕开微博热搜真相

作者 | 徐麟来源 | 转载自数据森麟&#xff08;ID:shujusenlin&#xff09;吃瓜前言关于新浪微博&#xff0c;向来都是各路吃瓜群众聚集之地&#xff0c;大家在微博中可以尽情吃瓜&#xff0c;各种类型的瓜应有尽有&#xff0c;只有你想不到的&#xff0c;没有你吃不到的。微博…

python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、

常规情况下&#xff0c;类的属性字典是共享的&#xff0c;而实例的字典是独立的。如果一个类的属性较少&#xff0c;但是拥有很多的实例&#xff0c;这些实例的属性字典会占用较多的内存空间。对这样的类来说&#xff0c;为了节省内存空间&#xff0c;可以使用__slots__类变量代…

普通帧,关键帧,空白关键帧的区别

1. 特点 帧——是进行flash动画制作的最基本的单位&#xff0c;每一个精彩的flash动画都是由很多个精心雕琢的帧构成的&#xff0c;在时间轴上的每一帧都可以包含需要显示的所有内容&#xff0c;包括图形、声音、各种素材和其他多种对象。 关键帧——顾名思义&#xff0c;有关键…

Spark入门系列(二)| 1小时学会RDD编程

作者 | 梁云1991转载自Python与算法之美&#xff08;ID:Python_Ai_Road&#xff09;导读&#xff1a;本文为 Spark入门系列的第二篇文章&#xff0c;主要介绍 RDD 编程&#xff0c;实操性较强&#xff0c;感兴趣的同学可以动手实现一下。RDD 是弹性分布式数据集(Resilient Dist…

Office2010启动慢的解决方法

以word2010为例&#xff1a; 解决启动慢的问题&#xff1a; 转自&#xff1a;http://www.blue1000.com/bkhtml/2011-12/70698.htm 首先启动Word2010&#xff0c;-->单击进入“文件”选项卡-->选择左边的“选项”按钮-->弹出“word选项”对话框窗口&#xff0c;-->…

如何在 Vue 项目中使用 echarts

数据的重要性我们大家都知道&#xff0c;就算再小的项目中都可能使用几个图表展示&#xff0c;我最近在做项目的过程中也是需要用到图表&#xff0c;最后选择了echarts 图表库&#xff0c;为什么选择 echarts&#xff0c;第一&#xff1a;简单上手容易&#xff0c;第二&#xf…

OpenCV实现在图像中写入汉字

由于OpenCV自带的cvInitFont和cvPutText函数不支持向图像中写入中文&#xff0c;参考http://www.opencv.org.cn/forum/viewtopic.php?t2083 中的方法&#xff0c;在windows7 64位机上用vs2008OpenCV2.3.1实现具体步骤如下&#xff1a; 1、新建一个控制台工程Test&#xff0c;先…

Operations Manager 2012 SP1配置部署系列之(二) SCOM监控SCVMM

你可以使用Operations Mangager连接到VMM上去监控VMM管理的虚拟机和虚拟机的主机的健康和可用性.你还可以监视VMM管理服务器的健康和可用性&#xff0c;VMM数据库服务器、存储库服务器&#xff0c;和矢量调制法的自服务门户web服务器.当你把VMM与Operations Mangager集成、VMM的…

ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系

前面已经介绍了如何使用URDF建造机器人小车并显示在Rviz的仿真环境里面&#xff0c;但是小车是静止的。下面介绍如何让它在Rviz里面动起来&#xff0c;并理清URDF,TF 和 odom 的关系。 1. ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系 一般在urdf文件…

谷歌新研究:基于数据共享的神经网络快速训练方法

作者 | Google Brain译者 | 凯隐责编 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;神经网络技术的普及离不开硬件技术的发展&#xff0c;GPU 和 TPU 等硬件型训练加速器带来的高算力极大的缩短了训练模型需要的时间&#xff0c;使得研究者们…

制作一个简单的linux

我这里是借助宿主机做的一个简单的Linux&#xff0c;我们只要知道一个Linux启动过程需要什么&#xff0c;这里制作就简单的多了。不过没有基础的也没关系&#xff0c;我写的很详细&#xff0c;没有基础的看了我写的步骤只要细心也是会做出来的&#xff0c;我这里的小Linux是很简…

nginx是什么,如何使用

一&#xff1a;nginx是什么&#xff1f; 二&#xff1a;nginx作为网关&#xff0c;需要具备什么&#xff1f;&#xff08;nginx可以作为web服务器&#xff0c;但更多的时候&#xff0c;我们把它作为网关&#xff0c;因为它具备网关必备的功能&#xff1a;&#xff09; 反向代理…

OpenCV中Mat数据结构使用举例

#include "stdafx.h"#include <string>#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;int _tmain(int argc, _TCHAR* argv[]){//创建一个用13j填充的 7 x 7 复矩阵-----1Mat M(7, 7, CV_32FC2, Scalar…

贾扬清加盟AI开发者大会!早鸟票抢购正式开启

整理 | 夕颜硬核 AI 技术大会&#xff0c;一年参加一次就够了。9 月 6日-7 日&#xff0c;2019 AI 开发者大会&#xff08;AI ProCon&#xff09;将在北京富力万丽酒店举行&#xff0c;人工领域技术领袖将再次齐聚一堂&#xff0c;探讨过去一年最新的 AI 技术趋势与变化&#x…

基本控件HyperlinkButton控件

HyperlinkButton控件可用来作为超链接按钮&#xff0c;支持页面导航。 若导航到MainPage.xaml&#xff0c;NavigateUri属性指定单击后导航页面的Uri 若导航到网页&#xff0c;必须同时指定TargetName&#xff0c;否则要报错。 <HyperlinkButton Width"200" Heigh…

江湖又现中科大少年班的传说

作者 | ——&#xff0c;夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;近日&#xff0c;《日本经济新闻》的一则报道指出&#xff1a;在左右着企业、国家和地区发展的人工智能领域&#xff0c;中科大少年班的人才支撑着中国的发展。中国自动驾…