总述

基于jvm垃圾收集算法的理论基础,不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。

HopSpot虚拟机的垃圾收集器如下图所示:

如果两个收集器之间存在连线,就说明它们可以搭配使用

虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器

虚拟机追求的提升,主要都在以下几个方向做努力:

缩短停顿时间:停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。

提高吞吐量:高吞吐量可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间/(运行用户代码时间 +垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%.

注意

先解释两个名词:并发和并行。这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下:

● 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

● 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

接下来逐一介绍这些收集器的特性、基本原理和使用场景。

Serial收集器

是java很古老的收集器,不过虽然古老,但是简单高效,依旧是Client模式下的默认新生代收集器。

特点:

单线程工作,并且工作时必须停止所有线程。

优点:

单线程效率最高 应用场景:

Client模式新生代首选。

ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本。

优点:

除了Serial收集器外,目前只有它能与CMS收集器配合工作

多线程时,支持并行执行垃圾收集,比Serial效率高

应用场景:

Server模式新生代首选,(于效率无关,主要是能和CMS一起用)

Parallel Scavenge收集器

它也经常称为“吞吐量优先”收集器。算法与ParNew基本相同,但是提高效率的方式注重提高吞吐量。

为什么高吞吐量和短停顿时间不可兼得?

GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的:系统把新生代调小一些,收集300MB新生代肯定比收集500MB快吧,这也直接导致垃圾收集发生得更频繁一些,原来10秒收集一次、每次停顿100毫秒,现在变成5秒收集一次、每次停顿70毫秒。停顿时间的确在下降,但吞吐量也降下来了。

Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。

优点:

可控制的吞吐量

应用场景:

后台运算而不需要太多交互的场景

Serial Old收集器

老年代

单线程

使用“标记-整理”算法

应用场景:

Client模式下老年代

Server模式下,它主要还有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使[插图],另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用

java虚拟机的heap监狱_JVM垃圾回收--垃圾收集器总结相关推荐

  1. 【中级04】Java 虚拟机 Runtime Data Areas以及垃圾回收

    1.运行时数据区存放的内容: 区域         权限 作用 程序计数器 线程私有 记录的是当前线程字节码的行号;java代码,执行jvm字节码指令的地址 栈stack 私有 存放局部变量.操作数栈 ...

  2. Java虚拟机的Heap监狱

    作者:刘欣 来源:码农翻身 在Java虚拟机中,我是一个位高权重的大管家,他们都很怕我,尤其是那些Java 对象,我把他们圈到一个叫做Heap的"监狱"里,严格管理,生杀大权尽在掌 ...

  3. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

  4. Java虚拟机(十四)——垃圾回收算法

    文章目录 垃圾回收相关算法 标记阶段 引用计数算法 可达性分析算法(根搜索算法.追踪性垃圾收集) 基本思路: GC Roots 有哪几类? 注意 对象的finalization机制 清除阶段 标记-清 ...

  5. 【深入理解Java虚拟机】读后感:JVM垃圾回收小结

    JVM垃圾回收小结 1.GC 问题侧重点 虚拟机栈.本地方法栈.程序计数器随线程而生,随线程而灭.栈中的栈帧随方法的进入和退出而有条不紊地执行着出栈与入栈操作,每个栈帧分配多少内存基本是在类结构确定下 ...

  6. 【深入Java虚拟机JVM 09】JVM垃圾回收finalize方法--对象最有一次自我拯救

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 即使在可达性分析算法中不可达的对象,也并非是"非死不可"的,这时候它们暂时处于& ...

  7. 深入理解Java垃圾回收——垃圾收集器

    <深入理解Java垃圾回收--虚拟机高效回收的背后>讲述了垃圾回收的理论思想,本篇文章来深入了解垃圾回收的实践:垃圾收集器. 在讲解垃圾收集器之前必要要统一几点认知: 1.用户线程:执行应 ...

  8. 【深入理解Java虚拟机学习笔记】第三章 垃圾收集器与内存分配策略

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  9. 深入理解Java虚拟机(第三版)--经典垃圾收集器

    Serial收集器 Serial收集器是最基础.历史最悠久的收集器,曾经(在JDK 1.3.1之前)是HotSpot虚拟机新生代收集器的唯一选择.大家只看名字就能够猜到,这个收集器是一个单线程工作的收 ...

  10. 生存还是死亡 —— Java虚拟机如何判断对象是否需要回收

    带着问题阅读 Java的内存区域中,有哪些区域是垃圾收集器所关注的? 怎么判断一个对象是不是需要回收? 导语 前面两讲,给大家讲解了Java的内存区域和常见的内存溢出异常,从这一讲开始,我们来学习Ja ...

最新文章

  1. Hadoop 故障整理
  2. einops包中的rearrange,reduce, repeat及einops.layers.torch中的Rearrange,Reduce。对高维数据的处理方式
  3. java phantomjs alert_Python+Selenium+PhantomJS脚本中的Javascript警报
  4. [AX]AX2012 AIF(二):文档服务编程模型
  5. MYSQL-5.5二进制包安装
  6. Floyed(floyd)算法详解
  7. Linux常用命令4(grep、df、du、awk、su、ll)
  8. syslog收到的日志存放在哪里_【Python】Syslog日志服务器开发amp;部署(12.5更新)
  9. linux下截图软件 shutter
  10. pta 是否完全二叉搜索树_23.二叉搜索树的后序遍历序列
  11. python的浮点数_Python的浮点数损失精度问题
  12. 好用的python工具_Python哪些工具好用?老男孩Python开发
  13. php判断是否夏令时,关于php:时区和夏令时问题
  14. Linux第一个正式版本,你安装的第一个Linux系统是什么版本的,成功没有啊?
  15. 怎样用计算机解决问题,如何用计算机解决问题.ppt
  16. zblog php 点赞,zblog文章下面添加点赞等表情的方法(使用畅言实验室)
  17. 什么是分布式存储系统?
  18. JavaScript设计模式 Item 6 --单例模式Singleton
  19. Neo4J 统计根节点、叶节点个数
  20. 【行业思考】关于商业模式的本质的思考

热门文章

  1. 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?
  2. SQL ltrim() 和 rtrim() 函数
  3. 控制方法只有相应权限才可执行
  4. 智能优化算法之模拟退火(Simulated Annealing,SA)-附源码
  5. GCC图神经网络预训练概述
  6. 科学语言与matlab计算 实验2、3
  7. 【LeetCode】【数组】题号:73,矩阵置零
  8. 机器学习-关键词:正则化、过拟合、决策树
  9. 教务管理系统C++实现
  10. 【ENVI预处理】辐射校正、影像配准、图像融合、图像镶嵌 、图像裁剪、图像增强