热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JVM学习总结三——垃圾回收算法

最近一段时间重温了以下JVM的相关知识,之前虽然了解过这方面,但是对于很多地方都是一知半解,为这次则对一些基础知识有了更深刻了的认识,也算是勉强跨过了入门的坎吧。本文主要是根据《深

   
整两天再看调优分析的部分,发现实际运行环境下,还是要考虑配置垃圾回收器,所以这里就加一小章介绍一下。

   
首先来看一下HotSpot所支持回收期的关系图:

bubuko.com,布布扣

    >图中可以看到一共有7中垃圾回收器,以中间绿线为界,上边三个用于年轻代,下边三个用在年老代,而G1则老少通吃,黑线线表示两个回收器可搭配使用,>红线则表示两者可以在同一区域交替使用。由于G1在JDK1.7才达到商用级别,而且目前线上环境也很少使用,在此不再介绍。下面我们来介绍一下其他六种:
>    Serial:从名字就能看出是串行的意思,该回收器是最早实现的,基于单线程,实现简单且效率高,但是进行垃圾回收是会造成“Stop-the-World”(STW),当回收内存区域较大时,就会造成程序响应时间变长。
>    ParNew:全名Parallel
New Generation,也就是并行新生代垃圾回收期,该回收器实现与Serial基本上一样,只是采用多线程执行回收。

>    Parallel
Scavenge:
并行清理,也就是并行垃圾回收器。该回收器与ParNew的最大区别在于ParNew通常与CMS搭配,一般注重于减少垃圾回收的停顿时间,提高响应速度,而
>Parallel Scavenge则侧重于吞吐量的控制,又名"吞吐量优先"回收器(吞吐量 = 运行用户代码时间
/(运行用户代码时间 +
垃圾收集时间);响应时间影响用户体验,而吞吐量则影响CPU利用率,进而影响程序程序运算效率)。此外需注意,该回收器不能够和CMS搭配使用。

>    >CMS:Concurrent Mark
Sweep,是一个并发回收器,旨在减少垃圾回收的停顿时间。我们可以从其处理过程分析一下:


 
  
bubuko.com,布布扣src="https://img.php1.cn/3cd4a/1eebe/cd5/ea91d84a82557da5.webp">

 



  1. 初始标记:该阶段只标记GC
    Root节点(见上一篇)直接
    引用的节点,会造成STW,但是时间很短。图中该阶段Object1、Object3、Object2标记


  2. 并发标记:该阶段是整个回收过程最耗时阶段,对于程序正在使用的对象,程序运行和标记交替进行,而程序未占用的则可以直接标记,这样程序整体对外停顿时间缩短(可以了解下并发的概念),减少了响应时间。该阶段图中Object1、 >Object3子树正常标记,而Object2子树并发标记。


  3. 重新标记:由于被程序占用的对象在一段时间后可能死掉,因此在并发标记结束后,可能有新对象死掉而未被标记,因此需要对这一部分重新标记。该阶段图中Object2子树需要重新标记。


  4. 并发清理:该阶段过程与并发标记类似。

   
CMS回收器的缺点主要在三方面:1、占用一部分CPU资源,导致吞吐量下降;2、由于并发过程是回收和程序运行交替进行,会产生一些新垃圾进入年老代而未被清理
,当年老代满时引起Full GC(因此一般年老代要预留一部分空间供程序使用);3、标记-清理的缺点——空间碎片,因此要适时进行压缩。

    Serial
Old:
没啥好说Serial的年老代版。

   Parallel
Old:
Parallel Scavenge的年老代版。


   下边我们来看一下几个垃圾回收器的各方面对比:













































名称    
区域 算法 适用情况
Serial
串行 年轻代 复制

单CPU(或CPU较少)、小型客户端应用
Parallel Scavenge
并行 年轻代

复制

CPU >、吞吐量优先(后台处理、科学计算)
ParNew 并行

年轻代

复制

CPU >、响应优先(web服务器等)
CMS 并发 年老代 标记-清除 响应优先(web服务器等)

Serial
Old

串行

年老代

sans serif", tahoma, verdana, helvetica; font-size: 12px;‘>标记-整理

>单CPU >、小型客户端应用
>Parallel Old
并行

年老代

sans serif", tahoma, verdana, helvetica; font-size: 12px; background-color: rgb(255, 255, 255);‘>标记-整理

>多CPU >、吞吐量优先(后台处理、科学计算)

    从上表我们可以总结:对于小型应用或是单CPU机上跑的应用,可采用Serial+Serial
Old;对于web服务器等响应优先的应用:ParNew(Serial)+CMS;对于后台处理、科学运算之类的,可采用sans serif", tahoma, verdana, helvetica;‘>Parallel
Scavenge+sans serif", tahoma, verdana, helvetica;‘>Parallel
Old;当然,具体采用什么样的搭配,还是要结合具体使用环境确定。
    到此结束,睡觉喽!


JVM学习总结三——垃圾回收算法,布布扣,bubuko.com


推荐阅读
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
author-avatar
淑敏小朋友
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有