我们都知道,java的gc是基于java的分代前提,不管是CMS还是G1,都是基于分代思想:老年代和新生代
思考一:为什么可以分代?
1、java中对象的生命周期是不一样的,在gc中对应年龄的概念。
短命的对象:如方法临时变量等。
长命的对象:如缓存对象、连接池等。
2、长命对象和短命对象之间的引用关系比较少(很重要)。
思考二:分代的优点是什么?
从垃圾回收的角度看,可以针对不同的分代采用不同的回收算法,提升垃圾回收的效率,降低系统stw的时间。
思考三:分代没有缺点吗?
假设我们有一个场景的java系统,是不符合思考一的java分代的前提的,那分代的垃圾回收算法反而会影响系统的性能。(期待能遇到一个这种系统。。。。)
思考四:分代只是为了垃圾回收?
就像第一点提到的,分代服务java对象,而java对象存在分配和回收两个过程,所以我们需要把对象分配和垃圾回收结合起来考虑分代,能同时提升对象分配和垃圾回收的效率才是分代想达到的目标