博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM的垃圾回收机制以及回收策略随记
阅读量:4189 次
发布时间:2019-05-26

本文共 2375 字,大约阅读时间需要 7 分钟。

JVM的垃圾回收机制及回收策略的随记

垃圾回收涉及到算法

复制算法:就是一块内存,分成两份,一份内存在没有执行垃圾回收之前一直是空的,为了后续的描述,假设A内存块是先用来装对象的,B内存是空的。假设执行了垃圾回收之后,A内存中存活的对象都会拷贝到B内存空间,并把A内存清空。这就是复制算法。

Mark-Swap: 标记-清除算法,标记-清除算法,就是对需要进行内存垃圾回收的区域,进行全盘扫描,把所有不存活的对象全部标记出来,然后进行同一的清楚处理。这种处理操作,容易产生了磁盘碎片,因为容易导致很多不连续的小内存,从而导致磁盘碎片。

Mark-Compact:标记-整理算法,标记整理算法其实和标记清除算法差不多,只是将标记的不存活对象(内存区域是不连续的),进行整理一块连续的内存,然后再进行内存清除工作。这种算法,时间效率上很定比Mark-Swap慢很多。

分代收集算法:分代收集算法,主要抓主了JVM的堆内存的划分是按对象存活的时间操作的,因此,堆内存的区域划分就有年轻代,老年代,永久代。一般在年轻代执行的Minor GC。而在老年代执行的Major GC(FUll GC).

以上算法都存在的缺点,就是当在进行垃圾标记的时候,所有用户线程都需要进行短暂的停顿。

现在开始随记回收策略。

像HotSpot虚拟记就是使用了分代收集算法和其他算法的混合策略。

年轻代使用的三种垃圾回收策略。

1,serial 收集器:该收集算法,是单cpu,单线程工作的,除了单线程工作外,在其收集垃圾的时候,机器上所有的用户线程都必须的停止工作。因此这样带来不是很好的用户体验。这种策略利用的是复制算法。
2.parNew收集器:该收集算法是也叫做并行回收收集器,这个收集器相对serial收集器,他是在多核CPU的情况下,进行并行的serial收集。也就是parNew使用的多线程执行了serial收集器。ParNew收集器除了多线程收集之外,其他与Serial收集器相比并没有太多创新之处,但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有它能与CMS收集器配合工作。
3,Parallel Scavenge收集器:并行收集器:该收集器也是利用了复制算法,以及多线程的并行处理策略。但是Parallel Scavenge他所关注的点,不是缩短所用用户线程停顿的时间,而是关注算法的吞吐量,Parallel Scavenge的吞吐量是指,cpu用于用户线程所运行的时间除以cpu总的所消耗的时间。吞吐量越大,代表用户线程使用cpu的频率越高,那么服务的影响速度也就会越好。

老年代使用的三种垃圾回收策略

1,Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。这个收集器的主要意义也是在于给Client模式下的虚拟机使用。如果在Server模式下,那么它主要还有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用 ,另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
2,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供的,在此之前,新生代的Parallel Scavenge收集器一直处于比较尴尬的状态。原因是,如果新生代选择了Parallel Scavenge收集器,老年代除了Serial Old(PS MarkSweep)收集器外别无选择(还记得上面说过Parallel Scavenge收集器无法与CMS收集器配合工作吗?)。由于老年代Serial Old收集器在服务端应用性能上的“拖累”,使用了Parallel Scavenge收集器也未必能在整体应用上获得吞吐量最大化的效果,由于单线程的老年代收集中无法充分利用服务器多CPU的处理能力,在老年代很大而且硬件比较高级的环境中,这种组合的吞吐量甚至还不一定有ParNew加CMS的组合“给力”。直到Parallel Old收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的应用组合,在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器。
3,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。从名字(包含“Mark Sweep”)上就可以看出,CMS收集器是基于“标记—清除”算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括:
初始标记(CMS initial mark)
并发标记(CMS concurrent mark)
重新标记(CMS remark)
并发清除(CMS concurrent sweep)
其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC RootsTracing的过程,而重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。

转载地址:http://wysoi.baihongyu.com/

你可能感兴趣的文章
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Linux网络运维-SSH
查看>>
Linux网络运维 -- 配置DHCP服务器
查看>>
Android开发问题记录
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>
图像调优3: CCM参数的标定
查看>>
ctags在verilog代码浏览中的应用
查看>>
NeoVintageous 在sublime中的使用
查看>>
用ncverilog跑仿真时,如何去除对特定路径的timing检查
查看>>
在ncverilog仿真条件设置中+nospecify ,+notimingcheck 和 +delay_mode_zero之间有什么区别
查看>>
linux下nerdtree安装方法
查看>>
最长回文子串(Go,LeetCode)
查看>>