00:00
那么接下来呢,我们先呃不着急往下说这个方法啊,说一个什么事呢,刚才咱们提到了说这个string,呃,咱们说呢,它这个数据呢,就是如果你是一个自变量啊,定义那个ABC是存在这个方法区的,哎,方法区里边呢,有一个叫字符串常量池,这块呢,我稍微说了一下,这个呢,得看你这个JDK这个版本啊,所以大家呢,稍微呢,咱们再多了解一点内容,这个事儿的话呢,后边咱们讲GVM的时候呢,也会给大家讲,所以这块呢,就先简单的。带着大家稍微说一下这个事情啊,后边呢还会讲。这个图呢,咱们前面已经看过了,哎,这个呢是这个官方啊,GM的这个官方规范当中跟我们说的这样一个图,这里边呢,你会看到这个堆和方法区,实际上呢,是不是两个并列的结构啊。就是堆是堆,方法区是方法区,哎是这样子来划分的啊呃,其实这个时候呢,我们看的是谁呢?这个咱们是拿一个具体的Java虚拟机来说的啊,那Java虚拟机原来还有具体跟不具体的说法吗?诶当然是有的,这个我们看这里边有一个PPT啊,这个呢,Sun公司咱们还说这个散啊散公司呢,它这个开发的Java语言,它呢开发了这个Java虚拟机,它有一个Java虚拟机的一个规范啊,这里边就提到一个事情,这个Java虚拟这个规范啊,它会随着这个JDK的版本的这变化呢,它会有所变化,那就JDK呢,比如说是5.0啊,6.0啊,7.0啊,8.0 9.0等等,这个JDK的版本在提升这个Java虚拟的这个规范呢,会有所变化。
01:35
这个也很好理解啊,那么这个障碍虚拟这是一种规范啊,这个规范呢得落地,落地呢那就涉及到具体的GVM,具体的GVM呢,我们说不止一个啊,S公司自己开发了一个叫hotport。那么还有叫BA这个公司g rocket,还有IBM的这个G9,这是诶相对来讲这个使用量比较多的这个GM了,啊说GM竟然还有多个,对啊,它需要针对具体问题呢,做一些优化处理,所以呢,它就开发了不同的GM,包括你像安卓的话呢,手机端咱们不可能说装一个这个GM了,你这个这个手机你的性能也比较差嘛,是吧,你不能跟服务器去比了,呃,像那个安卓的这个谷歌公司,他就把GM给改了啊,改成一个比较轻量级的一个虚拟机,因为安卓不是用Java来写嘛,你用Java写是不是也得跑呀,跑是不是就得用这个虚拟机啊,哎,所以它那个叫单位虚拟机,就是一个轻量级的一个GM了,还可以这样去理解啊,当然另外一方面还涉及到这个,这个叫什么专利的问题是吧,你拿着人家那个GM就玩跑,那不是奥瑞给告你嘛,你改一改是不是就少赔点钱呗,是吧,那得造个新的哈,不能用人家那个了,就是多方面的考虑,那咱们现在就说这个GM啊,就是不同的公司呢,推出了不。
02:51
的GM,咱们呢,通常所说的呢,其实都是指的house ball啊,其实呢,还有两个其他公司的,这两个公司呢,这个BA这个公司呢,后边呢,也被这个Oracle给收购了,哎,当然你现在看到这个sun呢,被Oracle收购了,这个BA呢也被Oracle收购了,收购以后呢,他就把这两个给合成一起了,哎合成一起的话呢,这时候又随着这个GDK版本的提升,它会有一些实际落地的时候呢,一些变化。
03:16
也就是说呢,具体落地的这个Java虚拟机他们也会有所区别,所以呢,我们要讲清楚这个GVM这个规范,这个事呢,其实是有点难度的,因为本身这个GDK版本在迭代,它有所变化,然后呢,这个规范呢,具体落地的时候呢,得看具体的虚拟机,这个具体的虚拟机在操作的时候呢,它也有版本的迭代,它也在变,所以你这个维度呢就很多啊,那我们这里边就得抓住一个主要的一个版本去说这个问题了啊,那么这个Oracle的话呢,很遗憾,它IBM太大了,他收不了是吧?啊,要收了以后呢,那就省事了,这个我们就看一个就行。啊,那现在的话呢,其实主流的就是这是一个啊这呢选一个咱这个呢,用又用的比较少,咱们呢装的这个JDK,诶默认呢都是hotport,这个呢,咱们可以看得到啊cmd Java-wash啊这个位置我们就看到了叫houseport这个虚机啊,那通常呢,咱们所说的这个说虚拟的这个底层结构长什么样子,默认的时候咱们提的都是它。
04:17
啊,你去公司工作的,呃,去面试的时候呢,呃,你就不用明确说说啊,我们以hotport为例说明,诶他这个说,诶好像你还懂其他的,你把别的也说一说吧,是哎,咱就默认,就你不用特意的说虚拟有好几种啊,那我先说一下好,然后说谁呢是吧,也挖了个坑啊哎,这个呢,是咱们看到的这个,呃,规范里边提到方法区跟堆啊这样分开的,哎,那么实际落地的时候呢,我们也把它认为是两个结构,那么具体来讲啊,我们下边呢,提到了一个事情,这个我就不多说了,就是这种堆呢,又又细划分了,嗯,我们看看这个吧。
05:02
我找那页啊,找这啊,大家看这就稍微呢,我们,呃,因为现在讲到字符串了,字符串就涉及到常量池了,常量池就涉及到方法区了,方法区就涉及到内存结构了,这个方法区呢有所变化,诶我们提一下这个事儿啊,我们只挑咱们这个目前涉及到的内容来讲,这个堆堆的话呢,刚才这不也稍微看了这个图了哈,这个的话呢,在这个规范当中呢,说堆细分的话,又有分三部分。这是Java区拟及规范当中说的啊,又有三部分,第一部分呢叫新生区,然后呢养老区,还有呢叫永久存储区,简称永久区,叫这个PM啊,这个叫永久区,嗯,这个永久区呢,你会发现我打成一个灰色的了,就是感觉呢,你要把它说出来呢,稍微有点没底气,为什么说呢?从这个规范上来讲,我们说堆呢有三部分,但事实上呢,我们这个永久区呢,就没有画到这个堆里边,这个永久区是谁呢?永久区其实就可以看作是我们的方法区。
06:08
啊,就方法区呢,就是相当于它的具体的体现呢,就是我们所谓的叫永久区了啊,那么这不是分开的吗?怎么这个又给它画到里边了呢?这就是说从规范上来讲呢,说把这个永久区划到堆里了,但事实上呢,我们实施的时候呢,没有把它归成堆里边。还挺绕的哈,这呢,我有一段这个话。找这段话。看这虽然Java区拟及规范将方法区,其实你就现在理解成是我们说的这叫永久永久区了哈,说Java虚拟规范呢,把这个呃方法区或者叫永久区呢,说描述为堆的一个逻辑,咱们看到那个三部分哈,但是呢,它还有一个别的名称,别名呢就叫做no keep啊no he就是非堆,目的呢,就是跟这个堆呢要分开。
07:00
能理解不?你要是这个,哎,看这啊,你要是这个新城区属于我们这个真正的堆里的啊,你这个堆里边要出问题的,咱们报的叫hi space啊,出的一个异常,人家这个呃,方法区啊,就是永久区出的问题呢,人家叫这个异常啊,你会发现呢,那还是有点区别的啊,还是有点区别的啊,就是实际事实上呢,是两个东西啊,是两个东西,那这个呢,先说清楚这个事儿,然后呢,我们接着回归到咱们说的这个常量池啊,这个Z链常量池呢,在咱们这个JDK1.6当中,把这个常量池放到方法区啊,因为1.6包括之前的版本呢,都可以这样来理解,所以说呢,我们看很多书啊,或者是这个帖子啊,基本上描述的时候呢,都把这个常量值归成叫方法区。也就是咱们刚才讲的时候呢,都是这样来画的,那么在JDK7的时候呢,变了JDK7的时候呢,把这个常量池呢给放到堆里了,把产卵池放到堆里了,说你这个怎么证明啊,这是咱们从那个官方拿到的一段代码,官方拿到这段代码当中,它有这样的一段描述,说呢一个string呢,在第七行呢,被创建了第七行。
08:15
我调这个的to方法,是不是返回来一个字符串啊,哎,说这个呢,哎,It goes in the啊,它呢,是在我们这个字符串常量池里的,这个常量池在哪呢?In the space hip space。是在我们这堆里了。哎,那其实呢,就相当于在这个七的时候呢,把这个长长池又放到这个堆里了,哎放到堆以后呢,这个八的时候呢,又变了,你看我这个图这样一动,这又变了,是不是又拿回来了。但拿回来以后呢,这个方法区呢,咱们刚才那会说它的体现呢,是不是叫永久贷啊,然后在GT8的时候呢,永久贷这个词没有了,改成了叫啊,Meta data space啊,叫圆空间,相当于在GDK1.8的时候及以后的版本,我们Z点常量池呢,你还可以说在方法区,只不过这个方法区具体体现呢,不叫永久带了,叫圆空间,那我们啊,还是说字符串常长池在方法区也没毛病。
09:15
啊,所以大家呢,就先暂时就最终落脚点啊,就是租链常量池,我们就哎都说它在方法区了,这个方法区的话呢,具体呃,这个怎么个情况呢?在六当中叫音乐带,八当中叫这儿啊七的时候其实不在风华区的,是在这儿的啊。哎,知道这么一个关系就行了,后边呢,咱们讲到大家这个讲项目的时候,哎,后后边呢,咱们还会专门带大家去讲这个GM,包括它的调油啊,垃圾回收啊,这时候呢还会去讲啊,到时候呢还会说这个事儿,所以暂时呢,大家就先把我刚才说的这个点呢理解一下就OK了啊。
我来说两句