堆内存的划分,怎么划分呢,在堆内存中有一个比较大的划分的,新生代和老年代,在新生代里面又会划分几个区域,EDEN区,s0和s1区,
为什么要做这样的划分,S0和S1大小都是相同的,相等的,目的是什么目的呢,是为了做复制算法的一个交换,复制算法的最大的一个优点是
什么呢,减少碎片化,S0和S1大小是完全相等的,我去画一个非常详细的一个图
1. 首先这是一个堆内存图,默认的新生代和老年代的比例划分是多少,就是1比2,老年代比新生代要大两倍,所以这里我们可以这样画,
按照等份来画,左边一份,右边两份,这个是默认的,你们也可以把新生代和老年代配置成相同的比例,这里我们可以把它叫做新生代,
右边的可以叫做老年代,有人可能就有疑问了,新生代到底干嘛用的,老年代到底是做什么目的的,新生代和老年代的表达含义是什么
意思,刚出生不久的就放在新生代里面,这边为什么会叫做老年代呢,会讲到计数法,计数法到时候会详细说的,引用计数法,这个引用计数法
GC频繁去回收的时候,刚出生不久对象会存在新生代里面去,如果你要是经常被使用,我用引用计数法做一个统计,我发现每次在回收的时候
都在被使用,一旦达到15次以后,你就会从新生代里面晋升到老年代里面,老年代里面主要是存放比较活跃的对象,存放经常被引用的对象,
新生代主要是存放不是经常使用的对象,比如我先做new了一个对象User(),假如他等于user1 = new User(),这个时候的user1是存在
什么地方呢我们放在新生代里面去,这个时候会经历GC的层层考验,你会发现经常被使用,我就会把它放到老年代里面去,垃圾回收机制,
一般是在新生代里面比较频繁,还是在老年代里比较频繁,垃圾回收机制一般在新生代比较频繁,老年代虽然也有,但是很少,
既然你的对象经常被使用,那我需要回收干嘛,你已经经过这么多考验了,老年代回收的次数比较少,如果你那个对象不是经常
被使用的对象,就会存在新生代里面,如果是经常被使用的对象,被GC已经验证过很多次的,会进入到老年代里面去,在新生代里面
又会分一个区,第一个区叫做EDEN区,EDEN区什么意思呢,新生代还有S0区和S1区,S0和S1区要相等的,有的地方把S0叫做from区,
S1叫to区,但是都是一个概念,但是我喜欢叫S0和S1区,
S0区和S1区大小相等的,在讲垃圾回收机制的时候会讲的,一个刚出生对象的话,我会把它放到EDEN区里面,放在eden区的时候,我的GC
进行回收的时候,发现你会经常被使用,这才进入到S0里去,如果我发现你在S0区也会被经常使用的话,这个时候我才会放到老年代里面去,
老年代里面是很少被回收的,除非你内存满的情况下,才进行回收的,这就是我讲的一个老年代和新生代的一个区别