JVM 调优简要思想及简单案例 - 对象的回收与保留
JVM 调优简要思想及简单案例-对象的回收与保留
前言
程序持续运行,不断产生新对象,那不再需要的那些对象应该怎么处理?
答案是 JVM 的垃圾回收机制,将不再需要的对象进行回收
仍然需要的对象怎么处理?
继续保留在 JVM 中
对象的回收与保留
假设存在仍然需要的对象,JVM 会怎么处理?
比如说我们可以理解为有一个全局变量类这样一个东西,例如 static 修饰的变量。JVM 内部会持续地保留这种对象,不会去进行一个回收。稍微提一下,其内部主要的实现原理是引用计数法,判断与 root 是否还存在引用,以及引用的次数。
JVM 的堆内存区域中,有一个分代模型,为了便于对象的创建分配空间,这个分代模型,也就是把 JVM 堆内存划分为了两个大区域。
一个区域我们称之为年轻代,另一片区域为老年代。如图所示:
年轻代和老年代一起构成了 JVM 中堆内存的主要组成部分,两者的特点:
年轻代:对象创建时主要的分部区域,存活时间短的对象会在这个区域中很快被回收掉
老年代:见字思意,老年代就是长期存在的对象所处的内存区域,当然,这里的长期存活,不是直接判断哪些对象会长期存活,哪些对象存活周期短暂而得来的,其中是经过 JVM 垃圾回收机制中的 GC 生存年龄判断得出的(之后会提到)。
总结
如果堆内存只有一片区域划分的话,每次垃圾回收的对象都是一整片内存区域,一个是回收效率低,另一个是内存的划分不合理,在回收掉无用对象后,会产生内存碎片,当内存碎片越来越多的时候,再想分配大对象也就不可能了。所以有了年轻代和老年代的划分,再接着这个描述可以想一想,内存区域还可以怎样划分?这样划分是否就是合理的?下一篇文章会对此问题进行解答。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/55275d415f5516013e3f5c543】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论