00:00
在讲完这个对空间之后啊,咱们接着讲下边一个章节啊,叫做方法区,诶方法区啊,也是咱们说除了这个对空间之外啊,另外一个非常重要的一个结构啊,应该说呢,在整个咱们运行时数据区当中有三个结构呢,是非常重要的啊,那对应的当然是我们说的这个叫占空间啊站或者也叫做虚拟基站啊对空间,还有我们这个叫方法区,这三个呢,应该说是最重要的这个结构。啊,最重要的一个结构,好也是呢,我们在开发中呢,是最关注的这个结构了,对吧?好那么关于这个方法区的话呢,我们有这样的几个点呢,是要跟大家去讲解,首先的话呢,提到了刚才说到的这个占堆,包括呢,我们这一章呢,要谈的这个方法区三者之间的一个交互关系,我们看一下在日常的代码当中啊,这个我们是如何在内存当中针对于某这个一行或者几行代码啊,这个具体的这些变量,具体的这些对象实体是怎么呢,分配到这个战队和方法区的,他们三者呢,是如何配合的。啊,现在有一个整体的一个概念啊,那其次的话呢,我们再关注一下方法区的一个理解,就好比是咱们前面讲这个栈结构,讲这个堆结构的时候啊,关于呢,一个结构呢,最基本的几个理解,这个呢是需要大家都得要清楚和掌握的。
01:13
啊,都得清楚和掌握的啊,OK,然后下个呢,就是设置这个方法去一个大小。我们说这个方法区啊,跟咱们前面讲的这个堆空间呢是一样子的,咱们呢,可以通过相应的参数呢,去固定这个方法区的这个大小,前面呢,我们是这个固定堆空间的大小,对吧,咱们也讲了相关的一些这个参数,那在这个面试当中呢,也是非常高频的这个问题诶大家需要去关注一下,那么方法区呢,我们也可以去设置它一个固定的大小,当然了,除了固定大小之外呢,咱们还可以设置成它是一个动态调整啊内存大小的也是OK的,那如果说呢,我们超出了你设置的这个堆空间的这个方法区的最大值,那照样呢,我们方法区呢也会报OM啊,那这里边又提到问题,就是说我们这个方法区呢,是不是存在垃圾回收啊,这个我在下边这块也写到了方法区呢,我们说也是会存在垃圾回收的,当然了这个Java虚拟机并没有强制的要求。
02:07
注意啊,Java虚拟机规范并没有强制的要求,说所有的这个虚拟机的实现当中,我们都需要呢,考虑垃圾回收啊,没有强制的要求,哎,但是呢,我们讲house SPA等等这块还是实现了的啊,行,我们讲到这时候再说,然后下一个问题呢,我们讲一讲叫方法区的一个内部结构,方法区的话呢,我们在前面讲堆的时候呢,也提到过,在JDK7的时候,我们称为叫永久带八,之后呢,我们讲啊,它呢要变成了叫圆空间是吧?那除了说是永久带到圆圆空间的一个变化之外呢,它内部还会有一些细节的变化。啊,还会有一些细节的变化啊,那么这个细节变化呢,咱们在这个呃方法区的细节演示这块呢,咱们也会说啊,涉及到了里边呢,关于磁误差常量池,关于静态变量啊,它的一个结构到底是从哪移到哪这呢涉及到了JDK6 JDK7和JDK8这样的几个版本,那么刚才呢,提到了是字符串常量值和静态这个变量是吧?那除了这个之外呢,还有哪些结构呢,是存在我们的方法区的呢?哎,我们在这个第四节当中,诶先呢,整体上给大家呢讲解一下,然后呢,我们再说呃,中间的一些个别结构的一个演变过程,OK,这样,那包括这个方法区结合呢,咱们前面讲到这个堆,呃,讲到这个栈结构啊,尤其是这个栈里边的局部变量表,操作时操作站是吧,这样的这个结构呢,我们搭配着去使用给大家呢,举个例子啊举个例子,主要呢,咱们还是得看代码中的一个实现对吧,那单纯的讲这些这个概念的话呢,这个大家肯定还是觉得差点意子,那我们呢,以上代码大家呢就更清晰,这呢也画了相关的一个图,方便呢大家去理解。
03:42
透彻啊,那这个呢,是我们说的方法区的演进细节,垃圾回收啊,这也提到了,后面呢是个总结行,那这个方法区呢,应该是咱们要讲的这几个结构中最后一个非常这个运营值数据区当中啊,最后一个非常重要的一个结构了,主要的这个点呢,就是我们这里边提到的OK,那首先呢,咱们来看第一个点,那提到的就是站堆方法区,它们三者之间的一个叫交互关系,或者呢,咱们也可以称为呢叫一个配合关系。
04:09
啊要注意的就是他们仨肯定不是一个竞争关系,对吧?诶是相互配合的,那具体呢,该怎么去看呢?诶那我们这块呢,来分别呢,做一个说明,首先的话呢,我们从这个内存结构上来讲呢,这呢就是咱们所谓的整个运行时数据区中的完整结构,从这个角度来讲呢,方法区是咱们要讲的最后一个结构。那在这个章节后面,咱们还要讲一个叫直接内存,或者叫本地内存是吧?哎,就是涉及到我们本本身本地的这个物理内存层面的一个内存空间啊,从这个运行时数据区角度呢,方法区是最后一个了,好,那么从这个线程共享与否的角度呢,我们把这个刚才讲的这个运行时数据区啊,咱又做了一个划分。做了一个划分,那线程共享的区域涉及到了就是我们说的叫堆合圆空间,这个圆空间呢,是我们JDK8当中方法区,咱可以看成具体的实现呢,也称为呢叫圆空间了,当然到现在的话呢,我们一直都叫圆空间,那在可以看到的未来呢,也不会再去修改了,因为此时呢,我们说这个呃,House虚拟机g rocket等等它已经统一了啊,都是叫圆空间,以后呢也没有必要呢再做修改,所以这呢就确定下来,嗯,那么由于这个堆空间和源空间,或者我们叫方法区啊,它是线程共享的,所以呢,我们在处理多线程问题的时候呢,一来呢通信更方便,那其次的话呢,我们也要考虑到这个安全的问题是吧,尤其是在这个推空间被占用的时候,一般呢,我们说这个圆空间啊呃,除了这个你动态加载的这个类型信息之外呢,一般的话呢,圆空间它这个相对来说啊,它的这个是比较稳定的啊,空间的占用是比较稳定的,所以呢,它的JC呢,就不会像我们对空间呢这么频繁。
05:46
咱们前面也讲对空间的时候说到过是吧,这个呃,较多的收集新生代啊,较少的收集老年代,基本上不动这个方法区啊,圆空间是这样的一个意思啊,但是呢,他们不影响各自呢,这个抛相关的OM的异常。
06:02
啊,这个OM的话呢,在我们圆空在这个方法区这块,如果你是圆空间的落地实现呢,咱们这个OM后边呢,叫Meta space。那如果说呢,你是用的GDK7及以前的叫永久贷了,这个时候呢叫oom啊,后边呢,这块呢,就是叫I pro啊,其实呢叫permanent是吧,就我们说的这个叫永纽带啊,就是显示的个信息呢,会有不同,OK,那么关于这个线程私有的结构呢,咱们前面已经说到过了,虚拟机站,本地方法站和程序计数器他们呢,要报的话呢,这是叫stack WF flow是吧?啊,因为他们都是这个站的这个结构,那么这个程序计数器的话呢,注意他呢不会报异常。这个回忆一下,大家还记不记得这个程序,计数成序计数器的话呢,它不会报异常,它也不存在着JC。不会报异常,也不存在JC,而我们的这个虚拟站和本地方法站啊,他俩呢是有可能报异常。但是它俩呢,不存在这个JC对吧,就这个呢是什么都没有是吧,既没有异常也没有JC,那我们这俩呢是有异常,但是呢,没有JC,那对于这两个结构的话呢,它呢是这个既有JC啊也有可能出异常,嗯,这个大家要区分一下,OK,然后中间这块呢,又放了一个叫re local。
07:15
哎,这个local的话呢,这个很多同学呢,应该在开发中呢,也有所使用是吧,就是我们如何保证多个线程在并发场景下的一个安全性,并发场景下的一个安全性是吧?那re local呢,典型的使用场景啊,就是我们像数据库连接管理啊,包括线程绘画管理啊等等这种场景啊,我们适用于叫独立变量的一个副本的一个情况是吧?用到这个local这呢,也算是一个渐进的一个过程,由共享到local到我们的线程私有。OK啊,体会一下,然后的话呢,我们来看一下这个叫站堆方法区,他们三者之间的一个交互关系,那这儿呢,我放了一行代码,这个代码的话呢,应该所有的同学都写过是吧,那个你做过开发的,或者你刚开始接触Java的,只要你接触过面向对象,一定呢我们拗过对象。好,那么从这一个最简单的代码的角度出发,我们说呀,当前声明的这个变量呢,叫做person,小写的这个P啊person,然后呢,类型呢是person类,那么很自然然的这个类型,咱们呢,就需要把这个整个类的结构呢,咱们加载到叫方法区。
08:17
啊八以后呢,我们叫源空间了是吧,加到这个方法区,所以呢,这个关于类本身这个自建码文件啊,第2CLASS所对应的这个运营实类本身我们要放在方法区啊,当然还有其他一些信息啊,这个咱们到下边呢,具体来讲解,哎,那你new的这个结构,我们说new的这个对象,咱们在上一章当中也提到过,这个new的对象呢,咱们要把它放在这个对空间当中。啊,那这一行代码呢,如果我们是在一个方法中写的,那方法内的这个变量呢,就是局变量,那我们呢,是不是方法都有具体的一个线程,它呢,这个方法就是个战帧,战帧里边是不是有局部变量表来存放我们这个person变量。对吧,诶明确一下,所以说这里边儿呢,我们通过这一行简单的代码,哎,就看到了占方法区对空间它们三者的一个交互关系,或者叫配合关系。
09:05
好,那我们从通过这个一个嗯,占堆方法器这样一个内存结构上来看的话呢,就是这样子的,咱们在这个Java站或者叫虚拟拟站的这个局部变量表里边,或者也叫做本地变量表是吧?Local variables本地变量表里边呢,我们放的就是各个这个变量,那咱们这相当于这个红色的叫reference,其实就相当于个叫person的这个变量。啊,叫person的变量,那这里边你看我写的还是比较清晰的啊,针对于咱们说的这个每一个结构呢,它占用的一个位置呢,咱们称为是不是一个叫槽啊,回忆一下咱们前面讲过叫slot是吧,那对于这个double和long类型呢,它是占两个槽啊,两个slot这个结构的。那这个大家稍微注意,像像这个少的话呢,也是占一个槽对吧,OK啊行,那么对于咱们这个引用类型的这个person的话呢,你就相当于是一个reference,一个引用,然后这个引用呢,指向了咱们堆空间当中你这个对象的实体,哎,我称为呢叫对象实例数据。啊,然后呢,在这个对象实例数据里边,我们有一个哎叫到对象类型数据的一个指针,这个指针呢,就指向了你这个对象呢,到底是哪个类new的,所以这个指针呢,就直接指向了我们方法区当中你这个哎对象类型的一个数据。
10:14
主要呢,就是类型数据是吧,就是我们当前这个person类,诶大家体会一下,那么关于我们说这个,嗯,对象的实例化,对象的一个这个叫什么定位等等这块的话呢,我们下边又给大家加了一个章节,哎,访问定位是吧,加了一个章节叫对象的实例化,内存布局和访问定位,这个呢,在一些大场面试题当中还是常会被问到的。啊,我这儿呢,是单独的给他拿出来了没有呢,放在这个方法区里边啊,因为呢,这个实际上呢,融合了咱们涉及到的这个占堆和方法区啊,专门呢给大家又放了一张啊这章呢来说一下这个关于对象讲完方法区以后呢,整个这个结构呢,就非常的清晰了。在企业面试题当中啊,大家呢,经常会看到这部分的问题,好,那咱们先把方问题讲完,到时候呢,给大家再讲这个章节,OK,那这里边儿呢,就涉及到我们这个对象的一个访问定位了,如何呢,找到对应的对这个图呢,大家记住,那其实除了这种形式之外呢,还有其他的形式,只不过呢,咱们Java虚拟机呢,没有选择。
11:11
啊,没有选择其他的方式,那其他方式呢,咱们到下一章当中再讲是吧,那其实我在这个里边也有涉及到啊,就是一种呢,是这样子的。啊,有个叫聚柄池,咱们Java呢,只不过没有选择这样的情况,哎,Java呢,咱没选这种情况,咱们选择呢,实际上是这种情况,就是刚才呢,我画的这个图,哎,放到咱们这PPT当中的。行,那么通过咱们刚才这个第一节的一个讲解啊,大家呢,知道我们这个战队方法区,他们三者之间之间的一个相互关系啊就可以了。
我来说两句