一、性能监控
1.1 jvm内存模型—堆
由于所有的对象实例以及数组都要在堆上分配内存,并且堆是垃圾收集器管理的主要区域,也被称为“GC堆”,所以堆是我们优化最多考虑的地方。
首先,堆可细分为:
- Young区(新生代):Eden空间、From Survivor 空间、To Survivor 空间(幸存者区)。
- Old区(老年代)
- 永久化 / 元空间,Java8 以前永久代,受 jvm 管理,java8 以后元空间,直接使用物理内存。因此,默认情况下,元空间的大小仅受本地内存限制。
清楚了堆的细分后,下面介绍新对象申请堆空间的处理流程:
GC具体流程如下:
- 首先,新对象产生时,JVM需要为该对象进行内存空间的申请
- 判断Eden区是否有内存空间放下该新对象,如果有,则直接将其保存至Eden区
- 如果Eden区空间不足,则会自动执行一个YGC,即Minor GC操作,将Eden区的无用内存空间进行清理
- 清理Eden区之后继续判断Eden区内存空间情况,如果充足,则将新对象直接保存在Eden区
- 如果执行了Minor GC之后发现Eden区的内存依然不足,则说明该新对象是一个大对象,此时判断老年区空间是否充足,如果充足,则将其保存至老年区
- 如果老年区空间不足,则进行一次Full GC清理内存
- 进行Full GC后,继续判断老年区是否有充足空间,如果充足,则将新对象保存至老年区
- 如果执行了Full GC后发现老年区的内存依然不足,则会报错OutOfMemoryError
- 每进行一次YGC(Minor GC)后,判断幸存者区(Survivor)是否有足够的空间,如果有,则那些未被清理的对象将迁移至幸存者区
- 如果幸存者区没有足够的空间了,则那些未被清理的对象会保存至老年区
- 每次Minor GC后,若处于幸存者区的幸存对象未超过存活阈值,则他们会在S0和S1两块区域中来回迁移,以尽可能留出大块的空闲区以接收每次Minor GC后的幸存对象
- 每次Minor GC后,若幸存的对象超过了存活阈值&