00:00
好,那么刚才呢,咱们讲的是对象分配的一般过程,一般过程,那么我们呢,呃,在这个图当中再稍微提一提一些特殊的情况。啊,或者说呢,我们基于刚才讲的这个一般过程啊,再重新捋顺一下啊中间呢,也涉及到一些特殊的情况,好咱们来看一下,诶这块呢,我们需要呢,去创建一个新的对象,那么在对空间当中啊,就需要分配这个空间,首先的话呢,我们考虑伊甸园区呢,是不是能放得下。我这画一个箭头,首先呢,我们来判断这个伊甸园区啊,是不是放得下,那如果能放得下,我们是不是把这个对象呢,就直接放到这个伊甸园区了,对吧,注意咱这块说呢,是真实的,你这个对象的实体并不是说我们这个变量啊,这个变量呢,本身我们是放在这个占空间中这个局部变量表里的。一般呢,都是这样子的,对吧,我们现在主要谈的是这个堆空间,你这个对象实体应该放在哪儿。行,这呢是我们说伊甸园区呢能够放得下的情况,那如果说呢,我们伊甸区呢,结果一看诶放不下了,那放不下的话呢,我们这时候呢,是不是就要回收一下这个一源区啊,所以就触发了我们的叫样JC,刚才呢咱们已经说过这个问题对吧?那触发完这个样JC之后呢,发现伊甸园区呢能放下了,那这时候我们是不是就还把它放在这个伊甸园区就可以了。
01:17
没问题对吧,这块呢,我们等下来解释啊,那么这就是我们直接放到一定园区,以及呢,垃圾回收之后呢,可以放到一定园区的这个情况。没问题,那么这块呢,大家看这叫超大对象,就是当我们进行完这个样JC之后,发现这个仍然不能够进行,哎,一个存储就仍然我们这个伊甸园区呢,是放不下,注意这时候这个情况,这呢是咱们的伊甸园区,这是幸存者人区,这是幸存者一区,咱们在进行这个样JC的时候,咱们是不是一定会把这个一点园区呢清理干净啊。你要是垃圾就被回收掉了,你要不是垃圾呢,是不是直接我们就放在这个相应的这个凸区是S0或者S1,谁是谁空谁是凸,对吧,我们就放在这个凸区了,洋YG呢样这C完以后,我们的1.h一定是空的哈,那么在它是空的情况下呢,我们这个新对象呢,你想想还放不下,那只有可能我们这个对象呢,是不是超大这个对象呢,在我们这个伊甸园区当中完全就存不下,比如说我这呢是一个十兆,你这呢,突然来一个12兆的一个对象,我是不是就放不下,那放不下怎么办呢?那我们这时候呢,就考虑呢,直接一步到位放到O区。
02:23
这是我们后边要给大家总结的,这个叫内存分配的一个策略啊,就是新生代如果放不下的话呢,我们就直接给他放到老年代。直接放老年代,老年代能放下,这个是注意我们分配对对象的内存空间,是指的是把它放到老年代的这个意思了。那如果老年代也放不下呢?老年代放不下的情况呢,有两种,一种呢,就是我们老年代呢,可能这个空间呢很大,比如我这块举个例子啊,有20兆,你这呢12兆,按说呢空间是够是吧,但是的话呢,我这个老年代我已经占用了这个十兆了,还剩这个十兆的空间,那你这块呢,是12兆,我这是十兆是不是乘不像那这时候呢,我们进行了一个GC,这个GC呢,叫做four g c。
03:05
For j c,或者我们也称为呢,叫做major j c。For j c mid j c,难道有有没有什么区别啊,这个咱们下边呢,给大家来讲啊,就是抠的细的话呢,还是有一些区别的,只不过呢,平时呢我们就混着用了啊,Mid j c four c,这个呢,大家目前就当成是一个意思,就只到那对我们老年代的一个垃圾回收。那老年代垃圾回收完以后呢,发现这个空间呢,剩的不足这个十兆了,不足十兆呢,能放下我们这个12兆的空间,那咱们就把它放进去呗,是不是能放得下,能放得下那咱就放进去了。还是放到老年代对吧,那这块呢,如果回收完以后发现呢,还是不够12兆的空间,或者说呢,本身咱们这个老年代呢,空间呢,假设是11兆本身就不够,你再回收的话呢,你这11兆是不是也放不下我们12兆的对象啊。就是我们刚才说的老年代的两种情况,就是在进行完放这些之后呢,还是放不下怎么办oom。
04:01
那你现在已经内存空间不够了是吧,这个存不下了,那这时候我们就OM了。这个注意啊,当然这个前提呢,是我们不允许这个虚拟机呢,是动态的调整,咱们的新生代和老年代的就不让它自动调整内存空间。啊,实际上我们这个GM的话呢,是有这种自动调整内存空间的这样的机制的啊,你不让它调整的情况下呢,你这块呢,已经满了怎么办啊,那就是OM呗。还就这个问题,好,这就说清楚了。里边的重点提到一个这样的情况,好,接着再来说。看这啊,那我们在进行这个样JC,注意这个样JC呢,触发的条件就是我们的伊甸园区呢,放不下了,我们才触发的新增者区零区一区,他们买的时候呢,不会触发啊,他们是被动的。嗯,当我们进行这个样JC的时候呢,我们这时候呢,实际上顺便呢,也会给咱们这个survival区呢,也会进行一个垃圾回收。它是被动的是吧?嗯,它也会进行垃圾回收,它进行垃圾回收,嗯,其实这块还涉及到啥呢?就是咱们伊甸园虚拟垃圾回收的时候呢,是不是有些对象呢,他要还存活着,他是不是要从伊甸园区放到咱们这个叫幸存者零区或者一区的是吧?呃,零区或者一区好,那么这个时候呢,我们考虑说能不能放得下呢?那如果说你往这块放能放得下,那S0区或S1区是不是就直接放进去了。
05:19
对吧,1D区的对象直接过来呢,就放到S0或S1了。没问题。嗯,这是我们说能放得下,嗯。那如果要放不下呢?比如我们现在呢,这个从新生代的这个对象过来,呃,伊甸园区的这个对象放过来了,放过来以后呢,我们这个这块呢,肯定S0,它这块呢,不也进行过垃圾回收吗?回收完以后的话呢,我们发现这个呃,S0或者是S1,就是这个所谓空的这个two区,它还放不下我们从伊甸园区过来这个对象怎么办呀?哎,本身这个对象不能死,你呢又放不下,那这块呢,我们就直接呢晋升到老年代。直接把这个对象呢存放到老年贷。
06:00
这是这个问题对吧,这是一步到位的,当然也有可能呢,就是我们在这个幸存者零区或一区,它呢被动的进行这个GC的时候呢,如果超过阈值的话呢,也会进入到这个老年代。所以刚才我们那会儿讲的,通过上一张图讲的,咱们是不是重点强调的是这个过程,以及呢,我们通过这个过程呢,才走的这个过程,实际上呢,还会存在这种特殊的情况,还有这块特殊的情况。这儿呢,大家关注一下。关注一下这个问题,咱们下边呢,还要给大家讲一下,叫内存分配策略,加上它一起整个呢,大家就能够把这个事儿啊理解清楚。
我来说两句