垃圾收集是一个很大话题,本文也只是看了深入理解Java虚拟机总结了下垃圾收集的知识。
首先按照惯例,先上思维导图:
垃圾收集简而言之就是JVM帮我们清理掉内存区域不需要的数据。它主要负责清理堆中实例对象、以及方法区的类对象、常量等。
GC回收过程
垃圾回收过程分三步:
1、将不可达对象进行第一次标记
2、进行队列执行finalize()方法
3、进行第二次标记,等待被清除
第一次标记过程:标记过程第一步是枚举根节点,JVM使用了OOMap记录了根节点位置以便快速定位。然后使用可达性算法寻找可达节点,将不可达节点进行首次标记。
第一次标记过程需要暂停线程运行(Stop the world),暂停线程的方法有两种,safe point和safe region,safe point将在方法代码中插入访问GC状态的代码,如果为true将自身挂起,但该做法有个问题是GC前wait状态的线程无法访问到他,所以出现了safe region技术,safe region技术使得代码执行只要在某段空间内都可进行垃圾回收,解决了safe point的问题。
如果是并发垃圾收集器如CML还会分为4步:
①、初始标记
②、并发标记
③、重新标记
④、并发回收
①、③步骤需要stop the world,②④步骤并发进行,①步骤枚举根节点,②步骤并发进行可达性分析,③步骤修复②步骤因并发引起的可达性节点变更,④步骤进行回收。
2、执行finalize()方法
3、使用GC算法进行回收
垃圾收集首先一个问题是:什么对象需要被收集?有两种典型的实现方法:
1、引用计数法,当一个对象被引用时,引用数+1,如果一个对象引用数为0,则被清除。该方法实现简单,理解容易,但缺点是无法解决循环引用。因此现在主流JVM采用下个方法。
2、可达性算法:首先确定根节点root,然后计算其他对象与跟节点是否可达,不可达则被清楚。
要理解可达性算法需理解以下概念:
Java的四种引用:
强引用:引用还在就不会被清除
弱引用:资源紧张时会被清除
软引用:下一次GC就被清除
弱引用:对GC清除没有影响,只是被清除时会获得通知
哪些可作为根节点?
可作为“根节点”的对象包括:1、虚拟机栈中本地变量表引用对象
2、方法区中类静态属性引用的对象
3、方法区中常量引用的对象
4、Native方法引用对象
虚拟机进行GC时用OOmap记录了变化中的根节点,当发生GC时能迅速定位到他们。
GC回收区域?
Java一般主力回收区域是堆区域,但也会回收方法区,堆区域主要回收对象实例、方法区回收的是类对象和常量。类对象的回收比较苛刻,需满足 :1、该类实例均被回收 2、加载该类的类加载器被回收 3、类对应Class对象没被引用没被反射。
在分代算法中堆也被分为了年轻代和老年代,根据不同年代采用不同算法。具体见下文分析。
计算可达性过程
GC首先是判断对象是否可达,其中有许多细节,如需用到Stop the world,即需要暂时暂停所有线程运行,Hot Spot虚拟机采用的是主动询问的方式,即虚拟机方法执行过程中会插入访问某内存地址的指令,当虚拟机需要GC时,则将该地址设为不可读,线程感知到虚拟机的信号则将自己挂起。
该方法有个问题是有些线程已经被挂起不能到达执行询问,因此有了改进方法safe region,即线程代码停留在区域内都可进行GC。如果是一些并发收集器就更复杂了,如CMS收集器它的计算可达性步骤就包括 1、初始标记 2、并发标记 3、重新标记 4、并发回收。13过程是需要stop the world的,3是为了修复步骤2并发标记时,一些引用发生改变的情况。
当检测到对象不可达时,它会被标记一次,并且进入执行finalized()方法的队列(不保证一定执行),然后被第二次标记,等待被GC。
GC算法
1、标记-清除算法
就是将标记后的对象清理掉,实现简单,效率高,但是会出现磁盘碎片。
2、标记-整理算法
在标记-清除的基础上外加了整理步骤,能够将内存空间整理有序,避免产生碎片,但效率更低。
3、复制算法
将堆分为两块区域,一次只使用一半,当发生GC时将标记对象清除,存活对象转入另一块区域自动就有序了。效率比标记-整理高,但要牺牲一定空间。
4、分代收集算法
就是将Java对象分位不同年代,对不同年代对象采用不同GC算法,例如将区域分为老年代、年轻代,年轻代又分为两块Survivor(10%)和一块Eden(80%)区,一次只使用一块Survivior和Eden区,发生GC清理后将剩余对象转入到另一块Survivor区。
年轻代进入老年代的方法:1、大对象直接进入老年代
2、动态年龄判定,当对象年龄超过所有对象中位数(猜想,也可能是平均数等),进入老年代。
3、空间担保,当将剩余对象分配到另一块Survivor区域空间不够时,会进入老年代。
年轻代主要复制算法,老年代主要采用标记-XX算法。
垃圾收集器
对于垃圾收集器仅仅对他们特性做了了解,如上图有7款垃圾收集器,G1是最新成果,全能的垃圾收集器,其他6个分别只适用于年轻代或老年代,他们的特性如下:
JVM系列2:垃圾收集器与内存分配策略的更多相关文章
-
jvm系列 (二) ---垃圾收集器与内存分配策略
垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...
-
JVM性能优化系列-(2) 垃圾收集器与内存分配策略
2. 垃圾收集器与内存分配策略 垃圾收集(Garbage Collection, GC)是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如 ...
-
【JVM.2】垃圾收集器与内存分配策略
垃圾收集器需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 在前一节中介绍了java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈 ...
-
java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
-
JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
-
GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍
一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...
-
深入理解java虚拟机_第三章(上)----->;垃圾收集器与内存分配策略
1. 前言 这一版块内容比较多,分为两篇文章来做笔记.本文讲述上半部分垃圾收集部分;下一篇文章写内存分配部分. 概述 对象已死吗? 引用技术算法 可达性分析算法 再谈引用 两次标记 回收方法区 2. ...
-
深入理解java虚拟机----->;垃圾收集器与内存分配策略(下)
1. 前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 2. 垃圾 ...
-
《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略
前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...
-
《深入理解Java虚拟机》(三)垃圾收集器与内存分配策略
垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收 ...
随机推荐
-
创建与删除SQL约束或字段约束
1)禁止所有表约束的SQLselect 'alter table '+name+' nocheck constraint all' from sysobjects where type='U'2)删除 ...
-
lrzsz在CentOS7的安装
在超级用户下打一句命令: yum install lrzsz 或者,在普通用户打一句命令,需要输入超级用户密码: sudo yum install lrzsz 然后使用Xshell 5建立连接即可
-
cxgrid footer summary value by a column
var AIndex: integer; AValue: variant; begin with cxGrid1DBTableView1.DataController.Summary do begin ...
-
4、Hbase
1).逻辑模型 Hbase 以表的形式存储数据,每个表由行和列组成,每个列属于一个特定的列族. 表中由行和列确定的存储单元称为一个元素,每个元素保存了同一份数据的多个版本,由时间戳来标识.行健是数据行 ...
-
1.5 外部销售自动创建为内部PR
1.5 外部销售自动创建为内部PR 1.5.1 业务方案描述 外部销售订单登记后,在销售订单录入界面点击一个创建内部申请按钮,自动将外部销售订单创建为内部申请,创建后将不得再次创 ...
-
poj 3370 鸽笼原理知识小结
中学就听说过抽屉原理,可惜一直没机会见识,现在这题有鸽笼原理的结论,但其实知不知道鸽笼原理都可以做 先总结一下鸽笼原理: 有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两 ...
-
Educational Codeforces Round 37
Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...
-
为什么hexo预览功能总是间歇性失效?
个人主题:yilia 有的文章可以正常截断,有的文章不行. 开始我以为这是hexo的一个小bug,但是后来通过查阅GitHub和知乎等网站发现这完全是由于我自己的粗心造成的…手动滑稽 hexo pag ...
-
Linux基础命令---IP路由操作
ip ip指令可以显示或操作路由.网路设备,设置路由策略和通道. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 ...
-
WebStorm 中 dva 项目用 start 命令需要不断重启项目问题
问题: 用dva-cli 构建的项目,用webstorm进行开发,通过 npm start进行启动,经常修改了文件之后,浏览器里面的内容没有刷新,需要重新执行npm start才行. 解决办法: we ...