JVM GC一个对象的朝生夕死

  • 时间:
  • 浏览:0

   将会这样s累积,每次新创建的对象,先被中放Eden,满了刚刚,中放老年代,老年代满了,full gc,我就发现,full gc真是是很频繁的,为了不一直对老年代进行回收,就要把年轻代后边对象的回收,做的过程久所以,中中放老年代的条件严格所以儿,所以 加入俩个 多后边缓冲带S。

     将可用内存分为:常回收内存累积+不常回收累积。按照对象与否一直被回收进行分配内存。对象创建刚刚,先中放常常进行垃圾回收的内存空间中,将会了吗不释放,再中放不常回收的累积。还要制定俩个 多标准将会规则,来定义多久对象从常回收累积移动到不常被回收的累积。

   这三累积都属于新生代,对象被创建刚刚,首先中放Eden中,经过一次Minor GC,被中放From Survivor,再次Minor GC,想象你此时身处From Survivor中,你身边有着经历过16此Minor GC还活着的老对象,它们被移动到了老年代中,还有像你似的,只经历过一两次的,大伙同時 被克隆技术到了To Survivor中,最后,From Survivor空了,Eden也空了,刚刚,To Survivor连续整齐的排列着熬下来还属于青年的新生代对象,From Survivor与To进行交换,此时,你又回到了From survivor中,静静地等着下俩个 多时钟周期的到来。。

     试想将会仅有s,在某个对新生代回收的时刻,这刚刚,在Eden与S累积,就有不连续的内存空间,合并刚刚,空间还是不连续的,有刚刚将会会再次出显并与否状态,给俩个 多对象分配空间,总的剩余容量是足够的,但会 这样连续的空间能才能达到对象的大小,这就尴尬了。所以 ,为了减少并与否碎碎念的再次出显,s拆分为s0,s1,两累积采用克隆技术算法进行对象交换,保证了在某个时刻,俩个 多s是空的,曾经空间是连续的。

    这累积主也不为了说明为那此要分代回收。

   假设应用线程占用的内存是从0000~FFFF并与否地址,现在应用线程执行到给俩个 多对象分配内存的那累积代码,给并与否对象分配了2345~2346这段内存,应用线程继续执行,到了某俩个 多时刻,应用线程分配的内存地址用完了,这刚刚,应用线程要回收这段地址后边,将会无用的对象,这样,它首好难从头到尾扫描一遍,但会 把其中没用的地址空间找到,刚刚将对象占用地址的起始位置和终止位置进行俩个 多向上将会向下的移动,将不连续的地址变成连续的地址空间,打扫房间开始了,应用线程继续分配内存执行应用线程;在一整块连续的内存中,进行所有对象的分配,土妙招是比较简单的,但会 也不每次就有从头到尾的扫描一遍,将会应用线程占用的内存非常大,将会应用线程还要对内部内部结构响应非常及时,这刚刚,就会再次出显很大的间题了。