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在优先级最低的线程中运行,在未运行的线程中进行 ...
随机推荐
- SpringCloud的Hystrix(一) 一个消费者内的两个服务监控
一.概念与定义 1.服务雪崩 在微服务架构中,整个系统按业务拆分出一个个服务,这些服务之间可以相互调用(RPC),为了保证服务的高可用,单个服务通常会集群部署. 但是由于网络原因或自身原因,服务并不能 ...
- SpringCloud的DataRest(三)
一.进阶配置定义 二.定制显示内容和控制方法使用 1.控制显示的内容 如果想让输出显示的数据始终按我们定义的格式显示: 配置之后返回的JSON数据会按照ListApp定义的数据格式进行输出 2.屏蔽自 ...
- js中的caller属性和callee属性
应该用"属性"来称呼caller和callee,而不是方法. caller:返回调用当前函数的函数的引用.a调用b,则返回a(a是boss,因为a把b叫过去干活了): callee ...
- Python之日志 logging模块
关于logging模块的日志功能 典型的日志记录的步骤是这样的: 创建logger 创建handler 定义formatter 给handler添加formatter 给logger添加handler ...
- python/基础输出输入用法
输出及输入的简单用法 print print,中文意思是打印,在python里它不是往纸上打印,而是打印在命令行,或者叫终端.控制台里面.print是python里很基本很常见的一个操作,它的操作对象 ...
- 双边滤波算法的简易实现bilateralFilter
没怎么看过双边滤波的具体思路,动手写一写,看看能不能突破一下. 最后,感觉算法还是要分开 水平 与 垂直 方向进行分别处理,才能把速度提上去. 没耐性写下去了,发上来,给大伙做个参考好了. 先上几张效 ...
- SQL注入 手注与联合注入
SQL注入,吧sql命令插入到WEB表单,或输入域名或页面亲求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令: 得到数据库用户名和密码 1:在以,{ .asp?id=32( ...
- [Codeforces 864A]Fair Game
Description Petya and Vasya decided to play a game. They have n cards (n is an even number). A singl ...
- 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为 ...
- 【USACO】电子游戏 有条件的背包
题目描述 翰的奶牛玩游戏成瘾!本来约翰是想把她们拖去电击治疗的,但是他发现奶牛们在玩游戏后生产 了更多的牛奶,也就支持它们了. 但是,奶牛在选择游戏平台上的分歧很大:有些奶牛想买 Xbox 360 来 ...