00:00
那接下来啊,咱们就按照这个目录的顺序啊,咱们一个一个的来给大家介绍,那首先第一个呢,叫做system.jc这个方法的一个理解,行,那这个方法呢,不知道大家在实际生产环境当中有没有主动的去调过啊,那这块我们来看一下这个方法的一个情况,那在默认情况下呢,我们说通过这个system.jc这个方法,那或者呢叫runtime.get runtime.jc啊这个咱们一会呢,看这个CMA jc的底层呢,就知道,实际上就是我们后边这样一个方法的调用啊,所以咱们主要呢,先讲这个方法,一般咱们写的时候呢,很少直接掉它了是吧?那当我们通过CMAGC这个方法呢,去调用的时候呢,首先说它会触发呢,垃圾回收器进行一个垃圾回收,那这时候我们触发的是什么呢?注意咱们触发呢叫four GC。For jc呢,就是我们涉及到新生代,老年代整体上的垃圾回收,对吧,那尝试呢,会释放被丢弃对象啊,占用的这个内存啊,就是一个for GC啊整个堆空间,包括呢,我们还有相应的这个方法区,这样的一个回收啊,我们称为呢叫for GC OK,那然而这边说c.JC呢,它附带着一个免责责任,免责声明说呢,无法保证对垃圾收集器的一个调用,嗯,这句话呢,大家能不能看明白?
01:11
能不能看明白,就是说我们stem.jc呢,咱呢,哎说它的作用是什么呢?哎去触发for jc啊,进行了一个垃圾回收,但是呢,我们说这个垃圾回收行为呢,不一定能够马上执行,就是不能够确保它执行的一个时间啊这呢就是它的一个免责声明对吧?免责声明呢,就是说呃,你你这个你没掉,别怪我哈,这个咱们在生活中是不是见到这种情况也很多呀。我记得我上这个高中的时候呢,当时看到这个美国,当时说有一些这个产品上是吧,就有一些免费声明,就看着是特别有意思哈,比如说呢,你买一个蛋糕,这个蛋糕呢,在他这个盒子的下面,它会写一个说请勿倒置啊,如果你倒置的,哎,这个责任不在我,那就是呃,你蛋糕呢,你整个给他反过来是吧,那整整个呢,蛋糕就没法吃了是吧?诶他说你别倒纸,那这是一个,还有一个呢,就是说这个在超市里边卖的小孩的这个,比如超人的服装,那小孩呢比较喜欢嘛,那这个超人服装上都会标一个免责声明,说呢,你穿上之后呢,那真的不会飞哦是吧?诶他必须要写上这样一句话,那据说的话呢,是因为出现过有的这个厂家呢,没有及时的去标明这个事儿,然后呢就被这个家长给告了,说呢,你看孩子穿上这衣服之后呢,他想跟超人一样飞,结果你这飞不了啊,我得告你,结果呢还告赢了,这个事儿就很奇葩了,是吧,所以说在这种咱们可能正常觉得说说这这不是有病吗?但是呢,你看在这种法律必要渐进的国家呢,我们说这种必要的一些东西啊,还确实得声明好,那这。
02:36
也涉及到这个问题,就是我们去调这个GC,你告诉我呢,说要调用这个for GC进行垃圾回收了,但是呢,我发现没执行,那你这怎么解释啊,那那这块呢,人家有个免责声明说呢,我不能确定它什么时候执行啊是吧,就这意思,也就是说呢,咱们这个c.DC这个方法呀,它仅仅呢是提醒Java虚拟机说呢,希望呢进行一次垃圾回收。
03:00
但是你调不调呢,是你的事,反正我这个事告你了,哎就这样一个意思,哎就这个意思,行,那下一个点看啊说呢,我们通过这个C尔这些这方法呢,来去调这个J些行为,但是一般情况下呢,咱们很少去这样去写,那为啥呢?因为你像我们每次都这样去写的,那不成了手动调用了嘛,对吧,咱们说Java虚拟机它是自动的垃圾回收,对吧,他在判断说呢,我需要这些了,哎,那我这块我就这个自动的后台进行一个垃圾回收,所以用不着你手动的再去触发了,所以这块呢,大家诶平时用这个方法呢,相对来说啊,应该少一些,但是呢,在一些极特殊的场景下呢,我们也有可能会掉这块呢,我举了一个例子,比如说我们在进行一个性能的基准测试,我们进行性能测试之前呢,我们先调一次GC,然后呢,接下来我们做这个测试的时候呢,有一个起始点,内存空间呢,我们这个保证它现在还都够是吧,防止呢有一些呃,内存的一些情况呢,就是最初的一些情况呢,导致我们后边这个性能测试呢,不太精准了,所以我们先做一个基准,哎,做一次GC啊就是这个意思啊。
04:00
行,那这块呢,我们关于这个这些呢,其实描述呢就到这儿,下边呢,我们来看一个例子,你看这个例子呢,相对来说也比较简单一些,你看我这呢,造了一个对象,这个对象呢,我就干脆直接也没复引用在对空间中,用完这个对象以后呢,我下呢就是通过C上的JC,那这个我们说它的意思呢,就是提醒啊,这个垃圾回收剂是吧,基于M的啊垃圾。那回收器执行是吧,JC行为啊。啊,执行咱们这个JC啊只是提醒他,但是这块呢,能不能马上执行呢,不一定一定啊这块呢,我先把这个方法呢,先注入掉,咱们一会儿呢来解释好,那如如果我这块呢,调了这个GC之后呢,你想想,如果咱们真的去做垃圾回收了,咱们前边是不是讲过对象的叫finalization这个机制,对吧,那么再去回收这个对象的时候呢,我们在回收之前一定会去调它这个finalize方法,所以我这块呢,把这个finalize方法呢,做了一个重写啊有这样一句话啊,这个super呢,加不加都行,因为咱们super这里边呢,本身它也没东西是吧?啊这就留着它而已了,就我重写的时候呢,自动生成的啊行,那么我们现在呢,去跑一下这个程序。
05:07
大家想,如果说我们这个程序调用了这个垃圾回收器了,那此时呢,我们会发现这句话呢,会输出是这意思吧,那如果没有掉呢,它就不输出了,跑一下。哎,这块呢,报了一个错,说这个是51的版本啊,这呢跟我这版本有关系,呃,这呢,咱们CAPTURE16这里边我看一下啊,这个我写的是七,咱们调成是一个八的版本。那八个版本,然后呢,在我们这个位置。哎,这个是怎么整了一个这个1.6呢,哎,整个1.8是吧,好,我们坐在这个JK8这个环境下,我们进行测试啊执行。诶出来了,行,这时候呢,大家你看我们在执行完以后呢,并没有去输出这样一个语句,那说明什么呀,就是我们提醒GM呢,去这个垃圾回收器呢,去执行这C,但是呢,不一定确保它能执行是吧。
06:01
但是不确定啊,是否马上执行这个GC。那如果不能马上执行,咱们这个程序也结束了,所以这块呢,就没有这样输出一个语句再跑一下。还没有再来。嗯,这个呢,我们多跑几次啊。那你看这时候呢,是不是就有了,那所以呢,我们这时候就能够得出一个结论,就是说,呃,确实呢,发现呢,这个不一定啊,就及时的来进行了一个垃圾回收了。啊能明白这意思对吧?好,这呢是我们说这个叫c.JC,然后这个c.JC这个方法里边啊,我们发现它实际上调的呢,是叫runtime.get runtime点诶JC方法啊,这个JC方法呢,又是一个native本地的方法,行,那也就是说呢,咱们调这个CJC,它呢,跟咱们调这个方法的效果是不是一样啊。哎,这我写一下啊,说与这个这个方法的嗯,作用啊一样啊,或者换句话说呢,我们这个c.DC的底层呢,就是runtime.get点点JC。
07:03
啊,就是这样一个方法,OK,行这呢,我们就说清楚了,这样一个操作啊,大家能明白,然后呢,你看我这块我又写了个方法叫system.run final是吧,诶我把这个方法打开,这是什么个情况呢。大家会发现啊,刚才咱们运行了好几次,终于出现了一次这个finalize这个方法的一个调用,对吧,那我现在加上system.run finalization之后呢,我们再来执行。再来执行,你看这时候呢,执行我们出现了这个finalize方法又调用了,我再跑一次,啊,又出现了,我再跑一次。还有,再来一次。还有是吧,我我不再跑了,那这块我想说明的意思是什么呀,就是我们如果只有system.jc,或者呢叫retime.get.jc,这个时候呢,不能够确保我们这个GM呢,一定马上进行垃圾回收啊,进而的话呢,也不能确定我们这个final方法呢会调用对吧?但是当我们去调用了这个叫run finalization这个方法之后呢,诶这个时候我们说呢,它一定会是吧?诶相当于是强制。
08:09
嗯,会强制,哎调用调用什么呀,叫失去引用的对象的,哎,Finalize方法。嗯,能理解这意思是吧,就是当我们去调了它以后呢,进行垃圾回收的时候呢,我们这个方法一旦加上它,一定确保我们这个finance方法呢会被调用,所以呢,我们才会出现的,每次执行呢,诶都会有这样一句话,诶这就我们想给大家描述这个点,OK,行,那关于C面JC的这个核心的这意思呢,大家能清楚就可以了。
我来说两句