4-JVM的GC算法(2)
来源:互联网 发布:ubuntu ssh安装 编辑:程序博客网 时间:2024/06/06 04:42
新生代可用的GC策略
首先介绍一种Stop-The-World(STW):Java中一种全局暂停的现象,全局停顿,所有Java代码停止,native代码可以执行,但是不能和JVM交互。这个过程多半由于GC引起,包括:(1)Dump线程;(2)死锁检查;(3)堆Dump。
串行GC(Serial Copying)
复制(Copying)清理算法
A、 扫描年轻代中所有存活的对象;
B、 使用Minor GC进行垃圾回收,同时将存活对象保存到“S0”或者“S1”区;
C、 在上一次Minor GC的基础上进行“S0”和“S1”的角色互换
D、 经历过多次Minor GC依然存活的对象晋升到老年代
并行回收GC(Parallel Scavenge)
复制(Copying)清理算法
操作步骤:在串行算法的扫描和复制时均采用多线程处理方式,并行回收GC为空间较大的年轻代提供了许多优化。
优势:在多CPU的机器上其耗时会比串行GC短,适合多CPU且对暂停时间要求较短的应用。
劣势:在年轻代使用并行GC处理的时候回产生一个STW的暂停,在进行对象回收的时候其他的线程会被暂时性挂起,来保证垃圾回收的彻底
图一:串行回收和并行回收
并行GC(ParNew)
复制(Copying)清理算法
并行GC(ParNew)必须结合老年代“CMSGC”一起使用,因为在年轻代如果发生了“Minor GC”时,老年代也需要使用“CMS GC”同时处理。
CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收的垃圾回收器,对于要求服务器响应速度的应用上,这种垃圾回收器非常合适。
老年代可用GC策略
串行GC(Serial MSC)
标记-清除-压缩
A、 扫描老年代中还存活的对象,并且对这些对象进行标记;
B、 遍历整个老年代的内存空间,回收所有未标记的对象内存;
C、 将所有存活对象集中在一端,而后将所有回收对象的内存空间变为一块连续的内存空间
优缺点:串行执行的过程为单线程,需要暂停应用并耗时较长。
并行GC(Parallel MSC)
算法标记-压缩
A、 将老年代的内存空间按照线程个数划分为若干子区域;
B、 多个线程并行对各自子区域内的存活对象进行标记;
C、 多个线程并行清理所有未标记的对象;
D、 多个线程并行将多个存活对象整理在一起,并将所有被回收的对象空间整合为一体;
优缺点:多个线程同时进行垃圾回收可以缩短应用的暂停时间,但是由于老年代的空间一般较大,所有扫描和标记存活对象上需要花费的时间依然较长。
并发GC(CMC)
算法标记-清除
A、 初始标记(STWInitial Mark):虚拟机暂停正在执行的任务(STW),有根对象扫描出所有关联对象并做出标记。此过程只会导致短暂的JVM暂停。
B、 并发标记(ConcurrentMarking):恢复所有暂停的线程对象并且对之前标记过的对象进行扫描,取得所有和标记对象相关联的对象。
C、 并发预处理(ConcurrentPrecleaning):查找所有并发标记阶段新进入老年代的对象(一些对象可能从新生代晋升到老年代,或者一些对象被分配到了老年代),通过重新扫描减少下一阶段的工作;
D、 重新标记(STWRemark):此阶段会暂停虚拟机,对在“并发标记”阶段被改变的引用或者新创建的对象进行标记。
E、 并发清理(ConcurrentSweeping):恢复所有暂停的应用线程,对所有未标记的垃圾对象进行清理,并且尽量将已回收对象的空间重新拼凑成一个整体,在此阶段收集器线程和应用线程并发执行。
F、 并发重置(ConcurrentReset):重置CMS收集器的数据结构,等待下一次的垃圾回收。
优缺点:只有在第一次和重新标记阶段才会停止整个应用,这样对应用程序的影响非常小。缺点是并发标记和回收线程会与应用线程抢占CPU资源,并且没有进行压缩,容易产生内存碎片。
图二:串行GC和CMS
GC选择策略
图三:GC的选择策略
以上策略的缺点:都需要扫描全部子内存。
- 4-JVM的GC算法(2)
- JVM 的GC算法
- 3-JVM的GC算法(1)
- 5-JVM的GC算法(3)
- 关于JVM的GC总结(涉及GC算法)
- jvm的GC算法总结
- JVM(2)——GC算法和收集器
- JVM学习(4)——全面总结Java的GC算法和回收机制
- JVM学习(4)——全面总结Java的GC算法和回收机制
- JVM学习之:GC的算法简述
- JVM学习之:GC的算法简述
- JVM学习之:GC的算法简述
- 关于JVM常用的GC算法
- 关于JVM常用的GC算法
- JVM学习之:GC的算法简述
- java jvm GC的基石 可达性算法
- JAVA基础知识-JVM的GC算法
- JVM的GC算法/类加载机制
- div 中 img 有间隙问题的解决
- Chrome浏览器跨域设置
- golang中不常用命令
- Winform 当前窗口跳转目标窗口关闭时资源的释放
- Android的eclipse的搭建
- 4-JVM的GC算法(2)
- 安装lxml遇到的问题
- Python实现Pat 1030. Travel Plan (30)
- math数学函数注释及用法
- OOAD设计原则(不全)
- swiper之平面滑动,第二张图片在中间
- CentOS 7 中安装Python全过程
- 缓动瞄准射击的坦克——最白话,手把手教你做系列。
- svn工作流程--svn服务器自启动虚拟机上测试自启动配置