内容源自Oracle《Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide》,文章主要是描述了GC在JVM运行中的意义,并且详细描述了在日常开发工作中如何选择、使用、调整Garbage Collection。(JDK11)
内容有些地方是纯理解的,并未实际验证,后期会对未验证的内容进行验证
序
- HotSpot根据不同的用户的不同的需求,提供了各种各样的GC的实现。尽管针对于Java SE,HotSpot已经配备了比较合适的GC,但是针对不同的Java应用,这样的基础配置不一定是最优的选择
- 关于GC的选择,会先叙述serial、stop-the-world GC-Collector的一些常用特性以及基本的调优。再然后会详细描述其它GC-Collector的特性,以及在选择这些GC-Collector的时候,需要考虑什么因素
关于Garbage Collection的三个问题
- 什么是Garbage Collector?
- 在选择使用Garbage Collector的关键是什么?
什么是Garbage Collector
- 定义:Garbage Collector 的作用就是动态管理JVM内存
Garbage Collector为了实现JVM的内存管理做了五件事情
- 对操作系统
- 从操作系统中获取和分配内存
- 将无用的内存返还给操作系统
- 对Java应用
- 当Java应用需要内存的时候,分配内存
- 决定Java应用当前哪些内存需要被回收
- 收回无用的内存进行重新分配
GC-Collector在性能提升方面做的几件事情
- 将分代思想应用于Heap内存中,根据对象是否可回收,什么时候可回收等因素将Heap分成了不同的年代。这样有助于针对不通的年代内存,采用不同的GC-Collector
- 将多线程应用于耗时的回收操作,尽可能的减少该部分损耗的时间
- 对内存进行压缩,解决内存分配过程中产生的内存碎片
选择GC-Collector的关键是什么?
- 阿姆达尔定律阐述了,在计算机系统相关的性能调优的时候,关键在于降低调优对象中串行计算部分的时间损耗。不同的GC-Collector其大部分的特点都在于如何降低串行计算的部分(阿姆达尔定律)
- 下面的图表是不同的GC-Collector在不同的CPU数量的情况下,CPU吞吐量的统计的实验结果(实验假定了一个比较理想的情况,系统只在进行GC)
- 1%GC表示GC损耗占1%CPU时间的时候,CPU吞吐量随着CPU数量增加的时候的变化。CPU数量达到30的时候,CPU吞吐量损耗占比为20%
- 30%GC的时候,当CPU数量增加到30的时候,CPU吞吐量损耗占比达到了80%
- 上面的实验结果说明了几个问题
- 在单CPU系统中,GC损耗对于系统正常运行的影响微乎其微,但是当CPU数量越来越大(large-system),GC损耗就会成为系统正常运行的一个瓶颈
- 如果GC-Collector的串行计算部分提升一点点也会对系统的整体性能产生巨大的影响