java性能优化--垃圾收集入门

176 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

java性能优化,有很多的方面需要我们学习和了解,前面花费很多的篇章讲解了jvm自身提供的性能分析工具,以及关于JIT即时编译器的内容。同时简单了解了其内部的工作原理,和优化方式。从本章开始,开始讲解一些在面试当中,老生常谈的内容:垃圾回收

概述

在具体学习什么是垃圾回收之前,我们需要先学习什么是垃圾收集?

java的一大特性就是,不需要我们手动的管理对象的生命周期,在我们需要的时候可以直接创建,不需要使用的对象将会由jvm自动进行回收。

垃圾收集简单来说只有两步:

  • 找到不在使用的对象
  • 释放被占用的内存

垃圾收集的问题?

通过上面的简单描述,我们发现垃圾收集还是挺简单的,但是事实并非如此。如果在垃圾回收的时候,有很多线程在运行,事实上就是如此,这将使整个垃圾回收变得非常复杂。

通常这些线程包含两部分:

  • 应用线程
  • 垃圾回收线程

垃圾回收的重难点

因为垃圾回收过程中,对象可能还在被应用程序的线程所使用,并且对象的引用地址可能是变化的。所以要准确的回收这些应该被回收的垃圾,必须要使应用线程不再访问这些对象。这需要暂停应用线程来实现,此时所产生的的停顿被称为时空停顿,也就是我们常常听到的Stop The World。这些STP对应用的性能有很大影响,所以减少时空停顿,是垃圾回收调优的关键问题

常见的垃圾收集器

关于垃圾回收的调优,离不开垃圾收集器,当前最常用的垃圾收集器有四种:

  • serial 串行垃圾收集器,单核cpu
  • parallel jdk8默认的并行垃圾收集器
  • CMS 并发收集器,不推荐使用
  • G1 目前垃圾收集器最前沿成果之一,jdk9默认

目前存在的垃圾收集器:

image.png

关于垃圾收集的内容,在后面的章节我们继续讲解。