2019独角兽企业重金招聘Python工程师标准>>>

java语言最大的特点就是可以进行自动垃圾回收处理,无需开发人员过于关注系统资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但同时也增加了软件系统的负担。一个不合适的垃圾回收方法和策略会对系统造成不良影响。

1.垃圾与回收算法思想

引用计数法:

引用计数法是最经典也是最古老的的一种垃圾回收方法,引用计数器的实现很简单,对于一个对象A,只要任何一个对象引用了A,则A的计数器上就加1,当引用失效就减1,当A的引用计数器值为0时,则A就不会再被引用。

引用计数器的实现也很简单,但是有一个严重的问题,即无法处理相互引用的情况。就比如A对象引用了B对象,同时B对象也引用的A对象,除此之外在没有其他对象应用A和B,则A和B引用计数器的值都不为0,但是A和B均不会再被使用,这样就导致不能回收到A和B对象,引起内存泄露。

标记-清除算法:

标记清除算法是现代垃圾回收算法的思想基础。标记清除算法把垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点可达的对象。因此未标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有未被标记的对象。标记-清除算法最大的一个问题就是空间碎片。以为回收后的空间是不连续的,工作效率低于连续的内存空间。

复制算法:

复制算法是一种相对高效的回收方法。它的核心思想是:将原有的内存空间分成两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,清除正在使用的内存块中的所有对象,交换两个内存块角色,完成垃圾回收。在JVM新生代中survivor中使用了复制算法进行垃圾回收。如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大,因此在垃圾回收时,复制算法的效率是很高的。且复制是统一将存活对象复制到新的内存区域中,因此不会产生空间碎片。

标记-压缩算法:

复制算法的高效性是建立在垃圾对象多,存活对象少的前提下。这种情况年轻代经常发生,但是对于老年代往往是存活对象多,垃圾对象少,在这种情况下复制的成本也将很高,因此复制算法并不适合老年代垃圾回收。

标记-压缩算法是一种老年代的垃圾回收算法,它在标记-清除算法的基础上做了一些优化。标记-压缩算法首先也是需要从跟节点开始,对所有可达对象做一次标记,然后将所有存活对象压缩到内存的一端,然后清除掉边界外的所有空间。这种算法避免了碎片的产生,也不需要两个相同的内存空间,因此性价比较高。

增量算法:

对大部分垃圾回收算法而言,在垃圾回收的过程中,应用系统软件处于一种“Stop the World”的状态。在“Stop the World”状态下应用程序的所有线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。如果垃圾回收时间很长,应用系统暂停时间也会很长,影响用户体验。

增量算法的基本思想是如果一次性将所有垃圾进行处理,需要造成系统长时间的停顿,那么可以让垃圾收集和应用程序交替止执行。每次,垃圾收集之回收一小片内存区域,接着切换到应用程序执行。如此反复直到垃圾回收完成。这种间断式的垃圾收集虽然减小了应用系统的等待时间,但是由于线程的切换和上下文替换的消耗,会使得垃圾回收的整体成本升高。

分代:

前面介绍的复制、标记-清除、标记-压缩等算法,并没有一种算法可以完全替换其他算法。它们都有各自的优缺点。因此根据垃圾回收对象的特点不同,使用不同的回收算法才是明智之举。

分代就是基于这种思想,它将内存区域根据对象的特点分成不同的内存区域,根据每块区域对象的特征不同使用不同的回收算法,以提高工作效率。

2.垃圾收集器的类型

按线程数分:

串行:一次只使用一个线程继续垃圾回收。

并行:一次开启多个线程进行垃圾回收。在cup能力较强时使用并行可以提高垃圾收集效率,缩短GC停顿时间。

按工作模式分:

并发式:并发式垃圾收集器与应用系统交替工作,以尽可能减少应用系统的停顿时间。

独占式:独占式垃圾收集器一旦运行“Stop the World”就停止应用程序运行,直到垃圾收集完全接受,才允许应用程序执行。

按工作内存区间分:

新生代垃圾收集器:只在新生代工作。

老年代垃圾收集器:只在老年代工作。

3.垃圾收集器

新生代串行收集器:单线程、独占式、复制算法;单CPU处理器时性能优越。

老年代串行收集器:单线程、独占式、标记-压缩算法;

并行收集器:工作在新生代、将新生代串行收集器多线程化,回收策略、算法、参数和新生产串行收集器一样。

新生代并行收集器:和并行收集器一样,但是可以设置“最大垃圾收集停顿时间”和“吞吐量大小”。自适应GC条件策略。

老年代并行收集器:标记-压缩算法,可以设置“最大垃圾收集停顿时间”和“吞吐量大小”。

CMS收集器:并发、标记、清除

G1收集器:标记压缩算法,可以进行精确停顿控制(在M时间内,停顿时间不超过N),预期优于CMS收集器。

转载于:https://my.oschina.net/u/3100849/blog/961038

JVM调优之:垃圾收集器相关推荐

  1. JVM性能调优3_垃圾收集器与内存分配策略__享学课堂

    Stop The World现象 GC收集器和我们GC调优的目标就是尽可能的减少STW的时间和次数. 内存分配与回收策略 对象优先在Eden分配,如果说Eden内存空间不足,就会发生Minor GC ...

  2. JVM性能调优2_垃圾收集器与内存分配策略__享学课堂

    判断对象的存活 引用计数法: 优点:快,方便,实现简单: 缺点:对象相互引用时,很难判断对象是否该回收. 可达性分析: 这个算法的基本思路就是通过一系列的称为"GC Roots"的 ...

  3. JVM(五)JVM调优

    文章目录 一.调优实践 1.1 规划 1.1.1 规划步骤 1.1.2 规划案例 1.2 解决JVM运行过程中出现的问题 1.2.1 用jstack定位锁相关问题 1.2.2 OOM问题的定位方式 1 ...

  4. JVM垃圾回收器-G1垃圾收集器

    Java8的G1垃圾回收器官方文档参考:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#ga ...

  5. jvm相关,垃圾收集算法,垃圾收集器,jvm调优--学习笔记

    对内存合理分配,优化jvm 参数,就是为了尽可能减少新生代(Minor GC),或者是整个老年代(Major GC) ,或者是整个 Java 堆 (Full GC) ,尽量减少 GC 带来的系统停顿, ...

  6. 面试-JVM-类加载-类加载器--自定义类加载器-JVM调优

    文章目录 ==类加载== 谈谈你对类文件结构的理解?有哪些部分组成? 谈谈你对类加载机制的了解? 编写java代码是如何运行起来的? 类加载机制 类加载各阶段的作用分别是什么? 有哪些类加载器?分别有 ...

  7. SpringBoot项目优化和Jvm调优(亲测,真实有效)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:星朝 原文:cnblogs.com/jpfss/p/9753 ...

  8. JVM调优,面到了阿里性能优化师!

    小K 菜哥,我看你朋友圈,你好像换工作了? 菜哥 对啊,前阵子被产品经理烦的头疼,就想换工作了.刚好找到一个不错的. 小K 给我说说呗,让我也参考一下,我现在工资才15K,主管死坑,我也想换工作了 菜 ...

  9. Jvm 系列(七):Jvm 调优-工具篇

    工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...

  10. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)

    2019独角兽企业重金招聘Python工程师标准>>> 文章同步发布于github博客地址,阅读效果更佳,欢迎品尝 运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我 ...

最新文章

  1. java中json重复数据结构_JS实现去除数组中重复json的方法示例
  2. 互联网协议 — BGP 边界网关协议 — Route(路由信息)
  3. mysql之 explain、optimizer_trace 执行计划
  4. mysql8.0默认引擎是什么_MySQL8.0新特性【转】
  5. 近期有哪些值得读的QA论文?| 专题论文解读
  6. [Ljava.lang.String; cannot be cast to java.lang.String
  7. fat+linux权限,Linux 文件和目录权限详细介绍
  8. 疫时急速挑战,AI 落地大考
  9. HandyJSON:Swift语言JSON转Model工具库
  10. Coverity代码静态检测工具介绍
  11. mac 运行android模拟器速度慢,Mac下顺畅的安卓模拟器:网易MuMu
  12. 如何选择固定资产标签?
  13. 大数据开发 电脑内存大小
  14. android电量优化方法,Android性能优化——电池使用优化
  15. 打印出js对象里面的内容
  16. Mysql Workbench connection ssl not enable问题解决
  17. python画三维坐标图像_用python检索xyz坐标并绘制三维图形
  18. pandas之dropna()的用法
  19. springboot之jpa支持
  20. 真够色!这个AI项目让画师们激动中又透露着瑟瑟发抖!忍不住想尝试

热门文章

  1. 使用Mongo Shell和Java驱动程序删除MongoDB的示例
  2. 学习C++开发技术,常见误解有哪些?
  3. github上创建java项目简单操作
  4. (转载)构建public APIs与CORS
  5. Linux find xargs rm .orig
  6. python核心编程-第六章-个人笔记(二)
  7. Android导出jar包后的资源使用问题
  8. 浅谈MySQL索引背后的数据结构及算法
  9. 方差(Variance)和标准差(Standard Deviation)
  10. 流处理框架Storm简介