GC——分代
Posted xiangguoguo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GC——分代相关的知识,希望对你有一定的参考价值。
新生代GC(Minor GC):发生在新生代的GC,这类对象生命周期短暂,GC频繁,速度快。
老年代GC(Full GC):发生在老年代的GC,频率低,速度较慢。
大多数情况下,对象在新生代分配,空间不够时会进行一次Minor GC,生命周期长的对象会转移到老年代。
大对象(需要大量连续内存空间的对象)在老年代分配。
分代的目的(个人愚见):GC会自动进行内存回收,但是前提是GC认为这个对象可以回收了:没有对它的引用。GC要获得这个前提,就得进行判断(根搜索算法等)。生命周期长的对象,在短时间内肯定存在引用的,频率可以放低,生命周期短的GC频率高点。
对象创建技巧:尽可能缩短对象的生命周期,即对象的作用域尽可能小。因为对象在作用域范围内是不会被GC的,那么当对象多了之后,可能需要进行Minor GC或者把生命周期长的对象转移到老年代。而老年代的对象的GC是很慢的。不利于内存回收:)
举个栗子:
比如:MyBatis中,SqlSessionFactoryBuilder对象的作用就是创建一个SqlSessionFactory,而对于一个数据库而言SqlSessionFactory只需要一个。这样一来,SqlSessionFactoryBuilder对象在创建完SqlSessionFactory后就没用了,所以把SqlSessionFactoryBuilder的创建放在局部进行。而每次访问数据库,SqlSessionFactory都要创建一个SqlSession,所以SqlSessionFactory可以是单例对象(饱汉式/饿汉式的优缺点再说)且随服务器启动、关闭而生死。
以上是关于GC——分代的主要内容,如果未能解决你的问题,请参考以下文章