00:00
好在我们谈完这个堆的核心概述几个问题之后呢,哎,我们接下来来看一下这个堆,作为我们说内存空间中非常大的一块空间,包括呢,我们对象的创建啊,这个数组的创建都是在这个堆空间中进行的,那我们这块呢,对于这个堆,这个它的内存再细分是什么样子的,我们做一个说明,这个呢,也是非常重要的一个内容啊,这个大家呢,一定要掌握。好,下面我们来看一下,说呢叫现代垃圾收集器,大部分呢都是基于分带收集理论来进行设计的。哎,分带收集理论什么意思啊,就是因为我们这个堆空间啊,它比较大。嗯,比较大,那么这个堆空间呢,我们又给它细分,就是我们在放对象的时候呢,分成了好几个不同的带啊是这样子的,那么对应的这个算法呢,我们有一个词呢,叫做分带垃圾收集算法。分带垃圾收集,这个带呢,就是我们所谓的把这个对空间又分的具体的这个细分的这个啊,一个区一个区的啊,或者叫一个带一个带的啊,这叫分带的意思了,行,那么基于这个分带垃圾收集算法呢,这个分带分带垃圾收集算法呢,就是基于我们这个堆空间的分带来讲的啊,那我们来看一下这个堆空间到底分成哪几个带,这里边呢,又分成了两种不同的情况,这个呢是按照我们GDK版本来分的。
01:14
说呢,在我们这个JDK7和以前的这个版本当中,咱把这个堆空间啊分成了三部分,那注意我这块儿说呢,是叫逻辑上,咱们分成三部分,咱们叫逻辑上呢,咱们一会儿强调啊,这个这三部分呢,分别叫做新生区,养老区和永久区,在GD8和以后的这个版本当中,也就是我们现在呢,这个主流使用的这个八,包括呢,我们后边呢,更新的这个版本,我们都是把这个堆空间啊分成这个叫新生区,养老区和圆空间。这个大家呢,要记住它。要记住它,那么后续的话呢,咱们说用的都是GDK8及以后的版本了,也就是说呢,这个原空间这块呢,这个在八的版本中就永久的替代了这个永久区,所以大家呢,更多的要关注于我们这个叫圆空间啊。好,那么首先呢,我们解决的第一个问题呢,就是这里边儿提到叫逻辑上是吧,哎说逻辑上呢,分成这三个区域,那这块呢,我再给你举个例子说呢,中华人民共和国从逻辑上呀,我们也分成了这样的三个部分。
02:11
啊,分别呢,是中国的大陆啊,这个虽然说这个这个面积比较大啊,但是呢,我们从逻辑上呢,也就是三部分,这个中国的大陆,然后呢,这个香港和澳门特别行政区,包括呢,我们叫台湾地区。那这呢,就提到台湾地区,我们标了一个红对吧,那就是分成这三部分,整体呢,构成了我们的,哎,叫中华人民共和国这样的一个疆域。那么八当中这个重名这个这个又命名这个咱们不关注了啊,就是从逻辑上呢,咱们中国呢,就是分成三部分啊,那么事实上呢,这个台湾这块呢,我们也得格外的说一下,这个主要原因是什么呢?就是因为台湾呢,现在呢,还没有完全的是不是归属到我们大陆呢,可以直接军队上呀,或者政治上呢,直接管辖是吧?诶所以这块呢,我们就稍微的先打上一个虚线,哎,大家呢,可以暂时的先这么理解,哎,也就是说呢,咱们这个堆空间从逻辑上来讲呢,分成了。
03:03
这个叫呃,新生区,这个叫养老区啊,这个呢,我们叫这个永久贷啊,这是七重的叫它,然后八重呢,我们叫的这个元红间是吧,先这样叫,然后首先呢,我们明确的一个问题呢,就是逻辑上分为三部分,但事实上呢,我们这个堆空间,咱们呢,就不包括这个永久带拉线。咱先不考虑它了,这个永久带,包括呢,我们八中提到这个叫圆空间啊,其实呢,呃,这个圆空啊,咱们都看成是这个方法去的,具体的落地实现了。啊,那么下一章呢,咱们专门呢就来讲方法区,到那个时候呢,咱们再来说这个永久带和这个圆空间的问题啊,所以暂时呢,咱们就哎这一章讲堆空间,咱主要呢,涉及到的就叫新生代和养老带啊新生区养老区行,那大家呢,也看到刚才我不自觉的一会儿叫新生代,一会叫新生区的是吧?啊这个养老区啊,有老年代啊这呢有几个名。大家别混了啊,就是我说呢,叫新生区,新生代,年生代呢说的是一个概念,然后养老区,老年区和老年代呢,说的是一个概念,后边的话呢,就不加区分的这样来叫了,比如说我说叫老年代怎么怎么着,哎,说的呢,其实就是养老区域怎么怎么着啊,这个大家呢,把这几个名呢都记一记啊,有点类似于什么呀,就是咱们讲这个类中的这个属性,咱们把它呢,是不是称为叫属性啊,也可以称为呢,是不是叫乘变量啊。
04:25
啊,属性或者叫哎成员。尽量是吧,那这呢就是我们同一个东西,但是呢,用两种不同的方式呢,来做的一个命名,那在这儿呢,也同样的道理,那咱们这块呢,既可以叫新生区,也可以呢叫新生代啊,也可以呢叫年轻代啊,对应这个英文的话呢,你可以叫这个young generation space,或者叫new generation space。啊,这是养老区的意思。啊,这个永久贷呢,我们叫permanent space。这个原空间呢,我们称为叫Meta space。逻辑上呢,包括三部分,但事实上呢,我们呃,现在说的这个堆呀,都没有包括这个永久区域和原弘箭。
05:02
啊哎,这个问题呢,再怎么让大家呢有个更深的理解呢,大家来看啊,咱们这个一开始的时候是不是写了一个叫hi hi DEMO是吧,在这里边呢,咱们把这个堆空间是不是设置的是这个数啊。那这呢是我们说初始的一个对空间大小十兆,然后这呢是最大的一个对空间大小呢,都是十兆,对吧?好,咱们把这个程序呢,再重新的给它抛起来。嗯,这个呢,我们点一个这个edit是吧,嗯,找到它,然后呢,我们这呢,参数都还在好都在的情况下呢,我们是不点一个OK。然后此时呢,我们点一个执行。行这呢,是不是就跑起来了,跑起来的情况下呢,咱们再来使用这个叫呃接VSOVM来看一下啊,这个其实就是我从这个。咱们的这个JDK当中。JDK咱们现在用的是八的这个版本,八这里边这个B目录下,这不有我们这样一个工具嘛,我实际上是把它添加到桌面这个快捷方式了啊,放到这了,其实一双击呢就打开了,或者呢,大家直接通过我们这个丁令航工具也可以,因为呢,咱们已经配了Java的环境变量了,是吧,所以在这呢,直接我们就输入下接啊。
06:12
啊。嗯,直接这块呢,我们回撤一下也可以呢,把我们这个命令呢,给它调起来。好,然后呢,我们在左边这就能看到这个进程是keep DEMO,双击一下。双击完以后呢,我们能看到咱们这个对空间设置的呢,分别都是十兆对吧,然后呢,这块打开叫VJC,这个VJC的话呢,大家那块呢,可能你默认打开的时候你看不到,为啥呢?因为这个呢,实际上是我额外装的一个插件啊,大家在工具这块插件你可以可可用的插件这块呢,可以找到这个叫维素JC,你给它下载一下就可以了。行,这是这个事儿,行,那我们这块呢,看一下。之前呢,咱们其实也看过啊,这个咱们刚才提到一个概念叫做新生区啊,一个叫养老区,那么这个新生区的话呢,具体细分呢,又分成了三部分,叫伊甸园区,这个幸存者零区和幸存者一区,这呢,我们把它三部分加起来,这是不是正好就是三兆啊。
07:06
这其实就是我们这个叫新生代啊,它呢是有三兆,然后这个呢,就是我们所谓的叫养老区,或者叫老年代啊,他这呢是有七兆。好,大家呢,把这俩数一加,是不是就是我们所谓的这个十兆啊,那这个十兆就是新生代养老带加一起的这个十兆,也就是说。哎,也就是说大家看这咱们的新生代养老带我们这个参数设置的是不是只管他俩区域啊,也就是说咱们这个堆空间,事实上呢,确实呢,暂时只包括这两部分。就像咱们现在这个中国,咱们国家呢,现在制定这个政策,咱们的政策呢,现在呢,说实话啊,咱们现在这个政策呢,是不是也只能够影响影响到这个大陆,是包括呢这个呃,香港澳门这块啊,针对于这个台湾这块呢,暂时咱们其实还影响不到它是吧?诶所以呢,就是呃逻辑上呢,分成三部分,事实上呢,咱们现在呢,还只能够是哎这个管辖这两部分这个区域啊这个大家注意一下。
08:01
哎,我举了一个政治上的一个例子哈,这个尽量呢,嗯,还是别举这方面的例子,当然这个例子呢,又相对来讲又合适一些是吧,咱们还是期待祖国呢早一天能够统一啊,把台湾呢早点给他纳起来啊。好,那么刚才呢,我们又提到一个点,就是关于这个新生代的话呢,它又分成了叫一地演员区和survivval区,这个呢,是咱们下边这个这个季节当中咱们要谈的这个问题啊,所以暂时呢,咱们就先哎不说这个问题了,哎大家先明确呢,我们这里边分成了这样的事实上的这两个区啊。好,这是我们说的这个问题。嗯,然后在这个八档八之前是不是提到叫permanent啊,然后呢,改成了叫metapace,这就是我们所谓的这个拥久带替换成这个叫哎圆空间啊,那关于这个替代关系啊,其实我们这块也是可以看得到的,哎,咱们先把这个程序给它停下啊,咱们也是能够看到的,怎么来理解呢?嗯,比如说我们这块呢,就找一个程序,咱们不妨就还以这个程序为例吧,这个程序呢,我们找到这个run啊,找到这个edit,然后在这块呢,我再加一个参数。
09:05
啊,这个参数的话呢,咱们还没有讲啊,我先用一下啊,这个呢,我们称为叫print,哎,加号啊。Printer jc。Details。啊,就是打印一下我们这个垃圾回收的一些细节啊,当然我们这个程序呢,有可能嗯,它都没有冒是吧,没有说具体的一些GC了,但是它也会打印我们这个相应的各个空间的一个,呃,各个区域的一个情况哈,好,我们把它加上以后呢,点一个应用啊,点个OK,好这此时的话呢,我们首先明确一下咱们当前这个module啊,我是在这个八的环境下。这是其一,其二的话呢,来看一下,刚才咱们设置这个位置,我用的这个GRE的环境呢,也是1.8,哎,都是在这个八的环境下,我们把它这个程序呢跑一下。跑起来了是吧,这种跑这个程序还不咋好,这个程序呢,咱们这块呢,始终停不了是吧,不往这跑了,咱们跑谁啊,咱们跑这个刚才的另外这个程序啊。
10:01
把这个参数呢,我们CTRLC咱放到咱们这个simple这放这对吧。啊,看这位置啊,站这OK。嗯,怎么又跑上他了呢?好,这个是吧。好,大家看这个时候呢,当我们加上刚才说的这个参数啊,叫print j c details的时候呢,我们能看到咱们这个堆空间它这几部分这个细节,刚才呢,说的这个叫年轻带是吧,哎,这个呢叫老年贷,然后这个呢叫圆弘间。啊这呢这几部分啊,这呢又分成伊甸园区,哎,这个星增镇林区,星镇一区呢,我们也称为呢叫from区或者叫突区啊细节呢我们后边再说,这呢我们看到关键呢是这样想让大家看到叫Meta space叫圆空间是吧?好,那么我们现在把这个GDK版本啊给它往下调,哎往下调怎么调呢?针对我们这个simple hi。大家看,嗯,针对于当前这个module,我们给它改成七。
11:05
我把他那改成个七的版本。好OK一下,然后我们在这个运行的时候啊,刚才呢,其实影响的是一个编译,我们在这个运行的时候呢,我们把这个位置也给它改一下。嗯,改成七,我这没有七是吧,没有七的话,我这块调一下。嗯,为了呢,咱们讲这个GM这个课,咱们在各个版本中的一些细节情况呢,我这呢是把这个不同版本的一个JDK啊都给装了一下,JDK呢,我们现在就拿七来说啊,你也可以拿六来说都行,因为七和七以前的都是一样子的啊,我们就拿这个分水岭七跟八呢来说明这个问题,好选择完七以后呢,我们做个应用。也用了是吧。哎,针对是咱们这个simple people啊,好OK一下,好针对他我们现在再去执行。行,那么这时候大家看这呢叫新生代,这呢叫啊养老贷啊,这呢是不是我们说叫permanent space,就是我们说的叫永久贷,主要呢,咱们来看这七当中呢,叫这个名,刚才八中呢,我们看到叫Meta space,它说明呢,确实七跟八当中是有一个这样的变化的。
12:10
啊,有这样变化,那为什么这块呢,明确要强调这个事儿呢,一个呢,就是我们说这个内存结构嘛,变化本身大家需要关注,另外的话呢,就是这个大场面试题当中啊,这个具体是哪个厂子,诶我忘了啊,诶不止一家公司,我们所谓这个大厂当中问到这个问题,就是说在这个JDK8当中说我们这个内存结构呢,主要有哪些变化,那么主要的变化呢,其实就是我们对共建当中的这个变化。那当然基于这个变化的话呢,我们涉及到这个string table是吧,叫磁物串常量池,包括我们这个静态的域,哎,它的这个结构呢,也会有一些变化,这个咱们后边再说,主要呢,也是基于我们这个变化,所以呢,如果问到八当中内存结构有哪些变化呢?大家要提出这个点。好,这呢,就是我们说的这个内存的这个细分,哎,大家需要记住这两个表格啊。
我来说两句