JVM调优简要思想及简单案例-对象的回收与保留

369 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

JVM调优简要思想及简单案例-对象的回收与保留

前言

程序持续运行,不断产生新对象,那不再需要的那些对象应该怎么处理?

  • 答案是JVM的垃圾回收机制,将不再需要的对象进行回收

仍然需要的对象怎么处理?

  • 继续保留在JVM中

对象的回收与保留

假设存在仍然需要的对象,JVM 会怎么处理?

比如说我们可以理解为有一个全局变量类这样一个东西,例如static修饰的变量。JVM 内部会持续地保留这种对象,不会去进行一个回收。稍微提一下,其内部主要的实现原理是引用计数法,判断与root是否还存在引用,以及引用的次数。

JVM的堆内存区域中,有一个分代模型,为了便于对象的创建分配空间,这个分代模型,也就是把JVM堆内存划分为了两个大区域。

一个区域我们称之为年轻代,另一片区域为老年代。如图所示:

image.png

年轻代和老年代一起构成了JVM中堆内存的主要组成部分,两者的特点:

  1. 年轻代:对象创建时主要的分部区域,存活时间短的对象会在这个区域中很快被回收掉
  2. 老年代:见字思意,老年代就是长期存在的对象所处的内存区域,当然,这里的长期存活,不是直接判断哪些对象会长期存活,哪些对象存活周期短暂而得来的,其中是经过JVM垃圾回收机制中的GC生存年龄判断得出的(之后会提到)。

总结

如果堆内存只有一片区域划分的话,每次垃圾回收的对象都是一整片内存区域,一个是回收效率低,另一个是内存的划分不合理,在回收掉无用对象后,会产生内存碎片,当内存碎片越来越多的时候,再想分配大对象也就不可能了。所以有了年轻代和老年代的划分,再接着这个描述可以想一想,内存区域还可以怎样划分?这样划分是否就是合理的?下一篇文章会对此问题进行解答。