jvm(四):垃圾回收
垃圾回收我们主要从以下三个方面进行描述
垃圾对象的判断
目前判断对象为垃圾对象有两种方法:引用计数法,可达性分析法,目前普遍是的是可达性分析法
可达性分析法的实现原理:
定义gcroot一直往下找,如果能找到对象,证明该对象在使用,如果找不到该对象,标记该对象应该回收。上图中栈作为gcroot只是其中一种情况,可作为gcroots的对象有虚拟机栈(栈帧中的局部变量表),方法区的类属性所引用的对象,方法区中常量所引用的对象,本地方法栈中引用的对象。
引用计数法的实现原理:
在对象中添加一个引用计数器,当有地方引用这个对象的时候引用计数器的值就+1,当引用失效的时候,计数器的值就-1,问题就是,如果a、b引用断开,这时候A、B对象计数器的值都是1,所以当循环引用的时候,不能进行垃圾回收。我们可通过代码试验此过程,注意我们需要配置以下虚拟机参数才可以看到垃圾回收日志:
垃圾回收算法
常见的垃圾回收算法有标记-清除算法,复制算法,标记-整理算法,分代收集算法。
标记清除算法:
此算法分为两个阶段,标记阶段(找到所有可访问的对象进行标记)和清除阶段(遍历堆把未被标记的对象清除)
此算法主要存在两方面的问题,效率问题和空间问题。这样会使不连续的空间越来越多,实在找不到空间的时候回触发再一次的垃圾回收。
标记整理算法
标记整理算法可以说是标记清除算法的升级版,标记整理算法也分为两个阶段,标记和整理,标记阶段是和标记清除算法的第一阶段一模一样的,均是遍历GC Roots,将存活的对象标记;在整理阶段会移动所有存活的对象,且按照内存地址次序依次排序,然后将末端内存地址以后的内存全部回收。
因为需要整理内存,与标记清除算法相比,标记整理算法需要花费更多的时间。
复制算法
复制算法将堆上的内存分为大小相等的两个区域,一个是活动区域,一个是空闲区域。在程序运行过程中使用活动区域,也就是有一半的空间被浪费掉
首先找出活动空间中所有存活的对象,将这些对象复制到空闲区域,将之前的活动空间清空,并变为空闲空间,存货对象所在的区域变为活动区域,这样就能保证在内存回收完毕后有一大片连续的可用空间。
分代回收算法
当前商用虚拟机基本都采用分代垃圾回收算法来回收垃圾,它主要是根据对象的生命周期将内存划分,然后进行分区管理
分代垃圾回收机制将堆空间分为新生代和老年代,新生代又被分为Eden区,From区,To区。当创建一个对象的时候,在Eden区进行操作,当Eden区内存不足的时候,会触发一次YoungGC(年轻代的垃圾回收),将存活的对象复制到From区,Eden区被清理,并继续创建新的对象,当内存再次不足的时候再次触发YoungGC,将Eden区与From区存活的对象复制到To区,下一次YoungGC的时候,将Eden区与To区中存活的对象复制到From区,经过若干次YoungGC后,还存活的对象会被复制到老年代。
垃圾收集器
serial收集器:最基础,发展最悠久的单线程垃圾收集器,适合桌面应用,适用于内存分配比较小,收集垃圾比较快的应用。
如有四个java线程在运行,垃圾收集时java线程停止,垃圾收集后,java线程继续进行。
parnew收集器:parnew收集器是是serial收集器的多线程版本,使用多线程进行垃圾收集(一般用于新生代收集器)
parallel Scavenge收集器:采用复制算法的多线程收集器,可达到可控制的吞吐量(cpu用于运行用户代码的时间与cpu消耗的总时间的比值(垃圾收集时间+用户代码执行时间)),可用-XX:MaxGCPauseMillis来设置,垃圾收集器的最大停顿时间,用-XX:GCTimeRatio来设置吞度量大小。此收集器与parnew比较相似,但是对吞度量要求比较高。
CMS收集器
CMS收集器是基于标记-清除算法实现的,其运作步骤为初始标记,并发标记,重新标记,并发清除(一般用作老年代收集器)
其中,初始标记,重新标记需要停止正在运行的java线程,初始标记是标记一下GCRoots能直接关联到的对象,速度很快,并发标记是GC Roots Tracing的过程(根据可达性分析法进行关联的过程),重新标记是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的对象的标记记录,这个阶段停顿的时间比初始标记稍长,但远比并发标记的时间短。可以看出,CMS收集器的耗时时间长的过程都可以与用户线程一起并发的执行。
G1收集器
G1收集器具有并行与并发结合,分代收集,空间整合,可预测的停顿等特点,采用标记整理算法,G1收集器不会产生空间碎片,分配大对象时不会因为无法找到连续空间而提前触发下一次GC,G1收集器能让使用者明确在一个长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不能超过多少,上面提到的收集器收集的范围都是整个新生代或者老年代,而G1将java堆划分为多个大小相等的独立区域(Region),新生代和老年代不再是物理隔阂了。
jvm(四):垃圾回收的更多相关文章
- JVM(四) 垃圾回收
1. 堆内存结构 Java堆从GC的角度可以细分为:新生代(Eden区.From Survivor区和To Survivor区)和老年代. 1.1 新生代 新生代是用来存放新生的对象.一般占据堆的1/ ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- jvm的垃圾回收算法
一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...
- JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...
- 扒一扒JVM的垃圾回收机制,下次面试你准备好了吗
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技 ...
- 2.1.JVM的垃圾回收机制,判断对象是否死亡
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
- JVM中垃圾回收机制如何判断是否死亡?详解引用计数法和可达性分析 !
因为热爱,所以坚持. 文章下方有本文参考电子书和视频的下载地址哦~ 这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么.然后触发条件是什么.最后虚拟机如何判断对象是否死亡. 一.前言 我们 ...
- 03 JVM的垃圾回收机制
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- jvm详情——3、JVM基本垃圾回收算法回收策略
JVM基本垃圾回收算法回收策略 引用计数(Reference Counting):比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的 ...
- JVM的垃圾回收机制
JVM的垃圾回收机制:(GC通过确定对象是否被活动对象引用来确定是否收集该对象.) 1.触发GC(Garbage Collector)的条件. (1.GC在优先级最低的线程中运行,在未运行的线程中进行 ...
随机推荐
- Eclipse在线更新慢
一.去掉不必要的更新 打开Windows-Preferences -> Install/Update –> Available Software Sites,将不需要的更新停用 二.关闭自 ...
- 开源软件:NoSql数据库 - 图数据库 Cassandra
转载原文:http://www.cnblogs.com/loveis715/p/5299495.html Cassandra简介 在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了 ...
- 修改hosts 流畅使用coursera
以管理员权限打开 C盘 -> Windows-> System32 -> drives -> etc -> hosts文件 在hosts文件最后写入 52.84.246 ...
- 百度播放器SDK 播放MP4格式视频有声音无画面问题解决
此处为记录解决过程. 所链接使用的MP4格式视频为codec id是mp4v-20.使用手机自带播放器可以播放,使用百度云媒体播放器不能无画面.经调试,Android Baidu-Cloud-Play ...
- 算法 排序lowB三人组 冒泡排序 选择排序 插入排序
参考博客:基于python的七种经典排序算法 [经典排序算法][集锦] 经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...
- hdu1052 Tian Ji -- The Horse Racing---田忌赛马贪心
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1052 题目大意: 田忌和齐王各有N匹马,判断怎样比赛,使田忌净胜场数最多. 思路: 一开始贪心出错, ...
- 【转载】C++基本功和 Design Pattern系列 ctor & dtor
最近实在是太忙了,无工夫写呀.只能慢慢来了.呵呵,今天Aear讲的是class.ctor 也就是constructor, 和 class.dtor, destructor. 相信大家都知道const ...
- [JetBrains注册] 利用教育邮箱注册pycharm,idea等产品教程。
我们在使用JetBrains的一些产品时,大多使用网上的一些key去注册或者pojie的,但是由于提供这些key的服务器并不能保证稳定可用,所以可能一段时间我们使用的ide又需要重新pojie. 这里 ...
- 《linux 网络日志分析与流量监控》记录
mac中有个本机连接vpn的日志,/private/var/log/ppp.log 消除日志(echo "" >/private/var/log/ppp.log ) li ...
- [HEOI2015]兔子与樱花
Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接 ...