【性能测试】三种基本的GC算法

本文介绍了JVM中的几种主要垃圾回收算法,包括标记/清除、复制算法等,并详细解析了Serial、ParNew、Parallel等收集器的工作原理及特点。

一、 标记/清除算法

内存中的对象构成一棵树,当有效的内存被耗尽的时候,程序就会停止,做两件事,第一:标记,标记从树根可达的对象(途中水红色),第二:清除(清楚不可达的对象)。标记清除的时候有停止程序运行,如果不停止,此时如果存在新产生的对象,这个对象是树根可达的,但是没有被标记(标记已经完成了),会清除掉。

缺点:递归效率低性能低;释放空间不连续容易导致内存碎片;会停止整个程序运行;

二、复制算法

把内存分成两块区域:空闲区域和活动区域,第一还是标记(标记谁是可达的对象),标记之后把可达的对象复制到空闲区,将空闲区变成活动区,同时把以前活动区对象1,4清除掉,变成空闲区。

速度快但耗费空间,假定活动区域全部是活动对象,这个时候进行交换的时候就相当于多占用了一倍空间,但是没啥用。

三、 标记整理算法

平衡点

标记谁是活跃对象,整理,会把内存对象整理成一课树一个连续的空间,

四、 JVM垃圾回收分代收集算法 

综合了上述算法优略

1.分代GC在新生代的算法:采用了GC的复制算法,速度快,因为新生代一般是新对象,都是瞬态的用了可能很快被释放的对象。

2.分代GC在年老代的算法 标记/整理算法,GC后会执行压缩,整理到一个连续的空间,这样就维护着下一次分配对象的指针,下一次对象分配就可以采用碰撞指针技术,将新对象分配在第一个空闲的区域。

五、 JVM垃圾回收器串行、并行、并发垃圾回收器概述

1. JVM中不同的垃圾回收器

2. 串行,并行,并发垃圾回收器(和JVM历史有关系,刚开始串行)

Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些现象多半是由于gc引起。

六、 JVM中Serial收集器、ParNew收集器、Parallel收集器解析

Serial收集器 单线程方式(没有线程切换开销,如果受限物理机器单线程可采用)串行且采用stop the world在工作的时候程序会停止

ParNew收集器:多线程(多CPU和多Core的环境中高效),生产环境对低延时要求高的话,就采用ParNew和CMS组合来进行server端的垃圾回收

Parallel 收集器:多线程,并行, 它可以控制JVM吞吐量的大小,吞吐量优先的收集器,一般设置1%,可设置程序暂停的时间,会通过把新生代空间变小,来完成回收,频繁的小规模垃圾回收,会影响程序吞吐量大小

七、 JVM中CMS收集器解密

低延迟进行垃圾回收,在线服务和处理速度要求高的情况下很重要

配置:XX:UseConcMarkSweepGC

concurrence(并发) Mark(标记)Sweep(清理)

低延时

把垃圾回收分成四个阶段

CMS-initial-mark初始标记阶段会stop the world,短暂的暂停程序根据跟对象标记的对象所连接的对象是否可达来标记出哪些可到达

CMS-concurrent-mark并发标记,根据上一次标记的结果确定哪些不可到达,线程并发或交替之行,基本不会出现程序暂停。

CMS-remark再次标记,会出现程序暂停,所有内存那一时刻静止,确保被全部标记,有可能第二阶段之前有可能被标记为垃圾的对象有可能被引用,在此标记确认。

CMS-concurrent-sweep并发清理垃圾,把标记的垃圾清理掉了,没有压缩,有可能产生内存碎片,不连续的内存块,这时候就不能更好的使用内存,可以通过一个参数配置,根据内存的情况执行压缩。

八、 JVM中G1收集器

1、可以像CMS收集器一样,GC操作与应用的现场一起并发执行

2、紧凑的空闲内存区域且没有很长的GC停顿时间

3、需要可预测的GC暂停耗时

4、不想牺牲太多吞吐量性能

5、启动后不需要请求更大的Java堆

通过案例理解JVM中PSYoungGen、ParOldGen、MetaSpace

Heap
PSYoungGen total 2560K, used 321K[0x00000007bfd00000, 0x00000007c0000000,

0x00000007c0000000)
eden space 2048K, 15%

used[0x00000007bfd00000,0x00000007bfd50568,0x00000007bff00000)
from space 512K, 0% used[0x00000007bff00000,0x00000007bff00000,0x00000007bff80000)
to space 512K, 0% used[0x00000007bff80000,0x00000007bff80000,0x00000007c0000000)


ParOldGen total 7168K, used 7097K[0x00000007bf600000, 0x00000007bfd00000, 0x00000007bfd00000)
object space 7168K, 99%used

[0x00000007bf600000,0x00000007bfcee7b8,0x00000007bfd00000)


Metaspace used 2647K, capacity 4486K, committed4864K, reserved 1056768K
class space used 289K, capacity 386K, committed 512K,reserved 1048576K

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值