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