00:00
下面呢,咱们来说一下这个方法区的一个演进细节,那还回顾到咱们之前讲的这个第四节的这个情况,第四节当中啊,咱们是系统的把这个方法区内部存储的这个结构啊给大家说了一下,当然说的时候呢,咱们就强调过,说这个存储结构呢,咱们理解成是一个经典的存储结构,就是方法区里边到底都放什么是吧?大大家呢,先记住这个版本,就是说大家呢,你可以就先记住这个四大文明古国都有什么,先把这四个记住对吧?记住之后呢,我们再看一下后续呢,它发生了一些变化,而不能一来呢,咱们就先看变化,这样呢可能就整个就懵了,对吧?那基于说我们这样的一个经典的内部存储结构之后呢,咱们下边呢,再来谈一下这个JDK呢,在不断的这个版本演进的过程当中,当然主要我们说的是这个障va虚拟机了,那在这个迭代的过程当中,我们方法区的内部结构呢,做了哪些调整啊这呢我们来说一下,这个呢也是需要大家来记住的,那在这个面试当中呢,也会问到这个大场面面试当中也会问到说这个在JDK8当中,我们内存的结构呢,发生了哪些调整,那当然了。
01:01
我们前面讲这个堆的时候呢,提到过那堆它的一个变化,其实跟我们这个方法区的变化呢,是互相影响的啊,因为有一些这个方法区的变化呢,是涉及到了这个堆了,所以呢,大家在面试的时候呢,能够把这个事儿呢,能够说清楚啊,也是非常必要的,OK,那我们这里边呢,就来谈一谈这个方法区的一个演进。首先的话呢,我们谈到这个方法去呢,大家先有这样一个共识,还有一个明确啊,就是说只有咱们的houseport呢,它才有这个永久带。啊,它才有这个英语带,就是方法区的话呢,咱们提到过是Java虚拟机规范里边提到的这样一个结构,但是呢,并没有明确说具体的这个虚拟机在实现的时候呢,说应该怎么样去实现,没有去讲这个问题,那么我们说一下这个house虚尼呢,它自己才有英纽带,对吧,咱们当时呢,不是还拿这个旺财呢来说这个例子嘛,那对于咱们说的这个g rockcket和这个G9来说,是根本不存在这个永纽带的概念的啊,这个大家要明确,那么对于g rocket和G9来讲,他们如何去存储我们说的所谓的类源信息啊,诶人家呢,其实就是用的这个叫圆空间啊,就是说的这个圆就是用的这个叫圆空间,那至于说咱们这个housewa虚拟,它原来有,后来又没有了,那么这个过程的细节是什么样子呢?我们看一下这个过程,嗯,要说这个事的话呢,咱们就得提到这个JDK1.6 1.7和1.8这样的三个版本,当然我们现在已经是JDK14了,那八之后呢,基本上都是这样确定下来的,就是在八以后的这版本呢,内存的这个结构基本上就固定下来了。
02:29
呃,关于这个垃圾回收器呢,咱们后续呢,变化的情况是比较多的,这个是咱们讲到下边的章节呢,要提的一个事儿啊好,那么在这个JDK1.6的时候呢,就提到说,呃,首先呢是有永久带,嗯,这个静态变量呢,也是存在咱们这个永久带上的,这也是大家呢,经常看到这个网上的各种各样的帖子,画这个内存结构图的时候呢,是不是一画的时候,当时就把这个静态变量就放到了咱们这个优纽带,或者说呢,叫方法区当中了。对吧,诶大家看很多网上这个,不管正规的也好,不正规的也好,讲这个内存结构的时候呢,都是这样画的,当然以前我讲课的时候呢,我也这样画过,就是把这个静态变量就直接放在我们这个方法区,哎方法区呢,落地实现呢,还在1.6的时候呢,还叫这个永久带,1.7也是永久带都放这儿了,但是后续呢,就不能再这样画了,因为这个结构呢有变化。
03:18
在1.7的时候。对吧,在这个1.7的时候呢,我们还是有有纽带的,但是呢,已经逐渐出现了叫去域纽带,这个过程变化实际上是非常的平缓的啊,其实在这个1.6的时候呢,这个houseport就已经开始啊,要动这个有这个动这个永久带的这个想法了。只是呢,还没有的这个付出,这个实施是吧,这时候已经开始做准备了,那在这个期的时候呢,又为我们这个进一步的去去永久贷呢,做了一个准备,那就是把这个永久贷当中的一部分内容啊,诶从这个永久贷当中拿走了。拿走了,那拿走什么了呢?呃,一个呢叫字符串常量池啊,这个table或者叫啊inter的string是吧,还有呢,叫静态变量,就是我们类当中生命的这个静态的变量,把它这两个结构呢,从油腻带当中移走了,放到了我们的方呃这个堆当中。
04:13
哎,这是在七当中的这样一个变化,这大家注意,那么GT8的时候呢,这个永久带的概念呢,就被干掉了,我们就没有永久带了,取而代之呢,叫做圆空间,这个圆空间呢,实际上就是我们这个J呢,它所采用的一种方式来存放我们的,诶主要呢,就是类源信息,对吧?当然还有这个叫运用式常向池啊,那么区域域用带以后呢,我们此时呢,替代了一个概念呢,叫做圆空间,所以呢,我把圆空间呢,也看作是咱们方法区的一个具体的实现了,好那么换完以后,像我们的类型信息字段呢,方法呀,包括呢,运行时常量池啊,里边保存的这些常量啊等等,咱们呢,还是放在这个圆空间当中,而在七当中呢,你把这个自符串常量池和静态变量呢,你给放到堆档中了,那还往回放吗?注意,就不往回放了,还是放在我们这个堆档中。
05:02
诶,还是放在那个堆当中啊,那关于这个自照常量池呢,基本上网上呢,在提到它的时候呢,这个事儿呢,都能说得很清楚,但是关于这个静态变量呢,说的都很含糊,很多这个书上,包括网上的帖子上呢,是回答的都还是错误的,就是认为这个静态变量呢,还是在我们这个,呃,又又给拿到这个原空间当中了,这个大家一定要注意是错的啊,就是这个静态变量呢,它仍然是在我们这个堆里边的。这呢就是大家记住这样一个结构啊,那为了大家呢,你能更好理解这个事儿,咱们也可以结合着咱之前呃,讲课的时候呢,提到过这个JDK的一个迭代的历史变化是吧?哎,重大事件咱们来这个稍微的看一看。前后的这样的一个时间节点。嗯,找一下啊,诶行就在这,那刚才呢,我们说在这个JT6的时候啊,六的话呢,你发现它是零六年,这个零六年呢,有个事儿呢,就是Java呢,建了一个开源的叫open jdk是吧,也就是我们所谓的这个开源的这个JDK的这个版本了,这是在零六年的时候,说这个时候呢,其实就已经有想动这个永久贷的一个想法,这是零六年,然后呢,在这个零八年的时候呢,出现一个事儿呢,就是嗯,Oracle呢把这个GI呢给收购了。
06:09
那这时候给收购了,而j rockcket里边啊,首先说JCK呢,是号称世界上呢,是运行速度最快的虚拟机啊,事实上呢,也确实是这些主流虚拟机当中呢,是速度最快的,那Oracle呢,把g rock克的收购,收购以后呢,这是在零八年,然后呢,在这个我这没写这个时间,在这个2014年是我们说这个JDK8的发布时间。那在这个八发布的时候呢,就相当于是把这个永久带呢给干掉了啊,所以说大家你想它是这个,呃整不清楚,你说Oracle呢,它是先有这个呃动这个永久贷的这个想法呢,还是说呢先呢有这个收购这个j rockcket的这个想法呢,说不好是吧,哎,总之呢,最终就是在JDK8的时候呢,实现了一个g rocket和我们houseport这样的一个融合,就是正式的把用语带呢给干掉了。OK啊,这就这样一个情况,行,那我们呢,再回过来。
07:01
哎,回来行,大家呢,了解这个事儿啊,那么这个变化的话呢,对应的我也画了个图,那这个图呢,就还是用我们这个工具来画的啊。那在这画的,所以你看这也行,看我们PPT也可以,那就是把刚才我们说的这个过程呢给描述一下,这是我们的堆,这是方法区,在六当中呢,方法区咱们说是个概念啊,这是大化虚拟规范中提到的一个结构,具体落地呢,在houseport的虚拟当中,诶我这个演进过程呢,具体指的呢,是不是就是houseport,诶这个大家要注意啊,这个这rock软件可不是这样子的,那house SPA虚拟当中呢,这个云久带呢,是它的落地实现,具体呢存放我们这样的一些结构,其中呢,提到了静态变量和我们这个,诶磁浮串常量池是吧?哎,都在这儿,然后在这个JDK7的时候呢,把这个静态变量和磁符串常量池呢,就放在了我们这个对空间当中,这呢就空出来了,然后在八的时候呢,注意此时呢,咱们这个方法区呢,实际上呢,它或者叫永久带啊,它还是用的是咱们这个虚拟机的这个内存。啊,虚拟出来这个内存跟本地内存呢,它其实有一个物理内存有个映射关系,对吧,那这呢是我们说这样一个概念,然后呢,在这个JDK8的时候呢,方法区的具体落地时间呢,我们叫做这个圆空间,它使用的是本地内存了。
08:11
那使用的是本地内存,这个时候呢,就不再使用咱们虚拟机这个内存了,嗯,直接呢把这个给拿出来了啊,那此时呢,我们的源空间的大小呢,就只受咱们本地内存它的一个上限的影响。哎,上的影响,那其实呢,就把这个部分内容整个拿出来,原来呢放到堆里边呢,那还放在堆里边。那就是我们看到这样一个场景,行,那如果面试当中问到这样的问题,大家呢,要能够把它说清楚。诶要能够表达清楚啊,这个是非常非常重要的一个事情啊,非常重要的事情,好,那这呢是我们说清楚这样一个演变过程,那紧接着这个问题说我们为什么要把这个永久带呢,被圆空间做一个替换呢。是吧?云语带为什么要被圆空间所替换呢?嗯,实际上呢,大家从这呢,也能看到这个不同的一个想法啊,你像这个house power呢,House po呢,它这个想法是什么呀,就是咱们这个内存当中有的这个呃空间啊,就好比咱们还是看这个图一样啊。
09:07
说我炸虚拟机对吧?哎,我设计这个结构的时候呢,凡是我们这个代码呢,需要分配用到的这个空间,我都是用虚拟机内存呢,来进行一个控制,调UJC是吧,等等都是我来控制的,那那很好理解,那此时的这个方法区具体落地的永久带呢,就是因为它的生命周期比较长嘛,我们也不频繁的去JC,所以就起了个名叫永带,这个呢,都还是用咱们这个虚拟内存。啊,Housewor这样一个想法其实也很好理解是吧,哎,就跟有的这个男生跟女生在一起之后呢,这个男生或者或者说这个女生吧,哎,对这个对方把对方呢看得很紧是吧,什么都得在他的掌控下,那housewa呢,就有点像这样一样说呢,诶,凡是我这个代码当中分配用到的这个数据,这个呢,内存都是我自己来分配的啊,都是我的这个虚拟机内存。OK,是这样,但是我们这个像get或者说呃,这个G9啊,像人家的话呢,呃,他就不这样想啊,他怎么想啊,他说这个呃,我们这里边加的这个类信息啊,这个类信息这个生命周期啊比较长,但是我这块呢,就呃不在这个,诶这个虚拟机内存里边了,直接呢就用这个本地内存啊,所以说呢,这个想法就不一样啊,就是说相当于是这个男女朋友在一起之后呢,说诶我们没有把这个对方看得特别紧是吧,有时候呢,你看的不是特别紧的时候呢,反而两个人的关系呢,是不是就更加的巩固一些。
10:25
啊,这两天呢,出了一个事儿,这个头条呢,我看是想不看都很困难,就是罗志祥跟这个女朋友分手了是吧,说呢之前疫情之前呢就分了,只不过呢,呃,这个人家这个女朋友我觉得写的还还挺这个理性的哈,说呢,前段时间为了不占用这个公共资源啊,现在呢,把这个情况呢给爆出来了啊,就是因为看了罗志祥手机了,结果导致了这个一下子没法再愈合了啊当然这里边儿这个细节咱就不多说了啊,就是呃调侃一下啊,你可能要不看的话呢,也可能没事儿,当然了,这个事儿本身我觉得应该看是吧,这个已经是比较严重的一个问题了啊行,呃,就是你要是呃不把这个呃我们所谓的乐源信息呢,放在咱们这个虚拟机当中,诶反而呢,可能更好一些,虽然说呢,感觉上这不完全受他控制一样。
11:12
啊呃,那到底哪种观点呢?呃更优更优呢,更好呢?呃,事实证明我们呢,把这个这个类源信息放在这个本地内存中是一种更好的选择,是吧?哎,是这样子的,行,那么回过来呢,咱们说一下,说为什么要做这样一个替换呢?那这呢,咱们要想解释这个问题,咱直接呢,就是看这个GD8里边的它具体的这个变化啊GDP呢,是122里边提到了这个问题。看他呢是怎么说的。啊,这呢,就是针对我们这个GT8当中提到的,就说移除了这叫英语带是吧?嗯,他有什么动机呢?这motivation啊,它的一个动机看一下看他怎么解释的哈,其实你会觉得非常的。非常的什么呀,嗯,看一下啊,说呢j j rocket说this is part说呢,这是我们这个j rocket和house bar呢,它进行一个呃融合的啊,进行融合工作的一部分啊,因为呢,Oracle已经具备了houseboard和j rockcket两大虚拟机,它呢要把这两个融合在一起,对吧?诶这个零八年的时候呢,不是收购以后,后来就要融合嘛,就是为了要把它们融合在一起,融合在一起呢,我们就需要呢,呃有这样的一个变化,说g rockck的这个客户呢,他不需要呢,去配置永久贷,为啥呢?因为GE rockck的根本就没有一个永久贷。
12:33
说的非常直接,因为JA没有应用带,所以JA用户呢,就不用去配置这个应用带,嗯,然后呢,我们就怎么着啊,习惯于。不配置英语代了啊,这还是说人家这个直销会的用户没了啊,这个解释就已经完了是吧?啊,你说为什么要替换啊,因为我这俩个融合只要可能没有,那我就干掉了。啊,这个解释好像呢,让你是不是就无力反驳啊,你说吧,也有道理啊,就有点儿像什么呀,就说呃,大家出去呢,比如说你买东西啊,看着大家都排队说呢,哎,那我也排队。
13:08
哎,你看别人排队就是你,你问你说你为什么要排队呢?你为啥要排队,哎,你说呢,呃,因为别人在排队,所以呢,我也排队,诶这个解释好像说也没毛病是吧?哎,说的也挺好哈,说别人排队我也排队。当然现在呢,一说这个排队呢,大家都会比较敏感啊,现在这个疫情期间还没有结束,所以一说到这个,呃,排队的事儿呢,一说人多,大家还都得这个避着点是吧?啊,那有可能这个疫情,呃,看这个世卫组织说啊,有可能是变成人类的一个常见病啊,不会说呢,这个马上就结束,主要呢,它变异的速度还是挺快的,咱们研发这个疫苗的速度肯定跟不上这个病毒变异的一个速度。啊,所以这样想呢,还是大家得多注意这个问题啊。行,那就未来呢,有可能人们的这个生活方式啊,呃,受到这个新冠影响,未来呢,可能还会有一个很大的一个变化。
14:01
诶,很大的一个变化啊,行,嗯,那么刚才说到这个问题,说那你为啥要排队,因为别人排队,所以我也排队啊,这儿呢,就有点像解释,咱们这叫motivation,就是他说的这个事儿,说你为什么要去掉,因为人也没有,所以我也去了啊总感觉稍微有点差点意思,那具体呢,这块呢,你看还有一个细节,当然这细节呢,就是基于他这个变化以后的一些细节来说了啊,那么咱们现在其实更想知道是,嗯,别人排队你也排队,那别人为什么排队呢?就是说呢,只能没有,所以说呢,我们就呃也去掉了,那GI为什么它就没有这个永久带呢。是吧,啊就是说你为什么别人大家都要排队呢?啊你说啊,因为呢,这个首先呢,这个排队呢,其实效率可能会更高一些,大家呢,你抢一下,我抢一下,这个抢的时间呢,反而倒很乱是吧?排队呢其实效率更高,这是其一,那其二的话呢,对于人家来的早的那些人呢,咱们说人家付出的这个时间成本呢,就更多一些,那是不是也优先呢,应该让人家就先获取服务是吧,所以呢,人家就应该先去操作,所以这呢一理解你发现啊这个事就就很清楚了。
15:02
啊就很清楚了,所以这块呢,我们也可以呢,先来过来看一下这个事儿,就是这是他官方的一个解释啊,我觉得还是比较牵强的啊,就是我们看不透这个问题,那咱们呢,呃,再从这个两个角度呢,给大家去做一个解释。做个解释啊,为什么要被替换啊,上面就说这个确实替换了是吧?呃,我们这时候呢,这个原空间啊,咱使用的就是本地内存啊,就物理内存为什么要改呢?基于两点原因啊,你看我这写的,大家看一看是不是有道理,第一个说呢,我们这个永久带啊,把这个变成是一个红色的。嗯,这啊,男的吧。跟上面那红的冲了啊,换成个蓝的说呢,为这个永久带呢,设置空间大小呢,首先来说是很难确定的。我们很难确定云厥带载的大小啊,说在某些场合,如果动态加载类过多,就容易产生这个OM啊,比如说呢,我们实际上这个外部工程当中,呃,功能点也比较多,咱们加载的很多的类,你想想一个是我们加载类多,炸包多,包括呢,我们这个类里边这个方法呢,有可能也很多,对吧。
16:07
方法的数量多,然后呢,常量池的这个大小会比较大,所以导致呢,就是我们不是太容易呢,确定到底我们应该开辟多大的这个永久带。如果你要是,呃,首先说我们用默认值可能会差点意思,咱们前面也讲过,默认值呢,其实并不大对吧?那如果你要是设置的这个游泳带呢,空间比较小呢,空间小的话呢,首先它就容易出现JC,那four j c大家可知道啊,它的这个成本是不是还是比较大的呀,对吧?那你要是空间小了,它容易引起four g c,那four j c的话呢,这个导致SCW这个时间和次数呢,就会比较多一些,显然呢,是拖慢我们程序的一个性能。啊,那另外呢,就是你说for jc完了以后呢,结果它还没有这个及时被回收,这个类呢,还都得用,那怎么办啊,是不是又出现这个OM了,那OM11出现这个程序就终止了,对吧?所以说你分配小了不行,那你要说分配大了吧,分配大了是不是有点浪费啊,又所以这时候我们就很难控制啊,就很难确定。
17:01
郑老师说的这个第一个问题。啊,那你很难控制,而我们这个原空间啊,原空间使用的就是本地内存,那本地内存的话呢,默认情况下,咱们也看了max ma space默认值是不是负一啊。也就是说最大值呢,没有限制。敞开了用是吧,只要我这有我就给你,你就用,你就不会出现OM。那同时呢,这个forc的机会是不是也比较少是吧?诶所以呢,我们永这个员工间呢,要更好一些,那再一个呢,就提到说对永久带呢,永久带呢进行调优啊也是比较困难的。啊也是比较困难的,其实这块呢,调这块这不就又涉及到咱们所说的这叫for GC了。你这个永久袋呢,说虽然说这个垃圾回收的机会呢比较少,频率很低哈,但是的话呢,你也有可能会出现这个for jc,那for jc呢,我们要进行垃圾回收,正常是咱们后边呢要提到的一个问题啊,先提前咱们看一下那方法区这个垃圾回收咱们主要回收什么呢?主要就是回收你常量池里边这这个回收我们放法区主要放的东西,主要放在一个呢,就是我们说叫类源信息,那就是你所谓的不再使用的这些类。
18:09
啊,包括你可能有类的加载器不用了也要回收,对吧?然后呢,再一个呢,就是常量池,你废弃的这些常量啊,不用的常量和这个不再使用的类,就主要是这俩东西,那常量的话呢,相对来说简单一些啊,没人用了,那我就回收,那对于这个类的话呢,你看我这里边儿写的密密麻麻的哈,要想保证说这个类啊不再被使用了,我们得校验这个这个这个这仨都得校验,都建验完,都校验完以后的话呢,呃,也并不意味着咱们当前这个类呢,就允许或者就要必然被回收了。啊,还会有一些麻烦事,总之的话呢,就是我们想判断你这个类或者是这个常量呢,不再被使用了,这个事儿呢,其实也挺花时间的,是不是就是我们这个for GC呢,其实很浪费时间,对吧?嗯,所以说呢,调优的话呢,也会变得比较困难一些,那就还是尽量的咱们是不是少出现for GC,那我们是不是就用这个本地内存要好一些啊。
19:05
啊,就是这样的一个问题是吧?诶你看我这样一解释的话呢,大家理解起来是不是就要更清晰一些是吧?诶这时候我们如果面试中首先呢,如果我要是面试官,我就会问这样问题,那你能说一说我们内存空间在JDK这个迭代的过程当中出现过哪些变化吗?尤其是JDK8到八的时候,那其实你要把这三个事儿呢都说一说,那你说完以后呢,紧接着我就会问你说,那你是怎么理解这个方法,这个拥有贷呢,要被员空间替代这样个事的。那如果说你说这个官网中是这样说了,当然呢,对方觉得呢,诶再深问一下,就好比说为什么要排队,你说别人排队我也排队,那我就再问说别人为什么要排队。对吧,哎,那大家再去答的时候呢,你就从这两个点来说,我觉得呢,你说完以后,对方呢,就会非常的清晰。啊,对方就非常清晰了,好张老师,我们把这个事解释清楚啊,然后呢,在咱们这个官方文档中,这还有个细节,这个细节呢,就解释了咱们刚才说的这个过程当中的这些变化。
20:03
啊,这个呢,我们还是带着大家一起来看一看啊,这个看英文呢,多少呢,还是会痛苦一些是吧,但是呢,大家也要试着来读一读啊,这个你要是刚开始学的话呢,你也可以考虑呢,就是在我们Chrome当中呢,点一下这个翻译成中文。那你看这时候翻译成中文呢,你再看它是不是要更好一些,更舒服一些是吧,那你这个看完以后的话呢,嗯,最好呢,你对照着来看,那对照去看好一点啊,这再刷新就成变成英文了,那咱们还是用这个英文来看。啊,用英文来看,其实呢,就是习惯就好,就像咱们用这个开发环境,大家都用习惯这个英文了,你要再换成中文,你是不是觉得非常诡异是吧,就跟写代码一样,都是用英文字写的,拼音文字写的,你要改成用中文写代码,你就觉得非常的不方便啊行就是个习惯的问题。行,来咱们这个稍微的看一下这里边这个点的变化啊,说移除了,呃,Part of the,呃,Contents,哎,这个永久贷的一个部分被移除了是吧,在我们house包里边移除到我们这个堆空间,呃,然后呢。
21:03
哎,其余的话呢,还保留到我们这个本地内存当中啊,就是有一部分呢,放到堆里边,有一部分呢,还在有一部分呢,就是放到我们这个本地内存中了啊,就是这样的一个情况啊,说这个它的一个这个这叫什么?哎,这个我们先看后边啊,哎,关于这个类的啊,这就是说关于这个类的一个我们说叫热点表示啊,主要呢,指的就是我们说这个类源信息。是吧,主要是指的就是我们这个乐源信息,它呢,嗯,Currently啊,当前呢,是存储在我们这个堆里边的,哎,我们把这个堆呢,称为叫叫永纽带啊,这个呢,主要是因为咱们逻辑上呢,把这个永久带呢,是不是也看成是堆的一部分了啊,是这个意思啊,所以这块呢,嗯,大家了解一下就行,是吧,咱们前面也说过啊,主要呢,你知道咱们所谓的这个类源信息诶,放在这个叫云油带里边了,说此外啊,说这个呃,纵符12常量值,或者叫自变量啊,和我们这个类中的这个静态的这个变量啊,它保存在我也保存在这个永久带里边,这是咱们之前的时候。
22:05
说呢这个永久带啊,它是被我们这个house包虚拟呢进行管理,然后呢,必须有足够的这个空间呢,来存放我们这个叫乐源信息啊,字面量的这个字符串和我们这个静态的这个结构啊,在我们Java程序呢被使用的时候。啊,就是你得有足够的空间啊,说这个类源信息和我们这个静态类个结构呢,它分配在这个拥久带,当我们这个类呢被加载的时候啊,它就在这个呃用语带呢进行分配了,这个大家都理解啊,而且呢,它还会被这个GC进行回收,当我们这个英语带呢,啊进行JC的时候呢,还会被回收。啊,或者我们这个当这个类呢,本身被卸载的时候呢,我们要从英语带里边呢,把这个类源信息和这个静态的这个结构呢。啊,要给它回收掉是吧,静态结果回收掉。嗯,那么我们这个字符串常量池呢,它也会被回收,诶,当我们这个云云带来进行这个JC的时候。啊,这个都很清楚是吧,也就是说当我们这个启动一个类的时候啊,因为应用程序呢,在启动的时候呢,我们这些信息就是类源信息和我们这个静态结构呢,都要被加载,当我们这个类呢,被卸载的时候呢,我们的这个类源信息和我们静态的结构,包括呢,我们这个呃自链常量哎,都要被回收掉啊是这样子的。
23:22
说嗯,这个拟定的是吧,这样的一个实现。它将被分配我们这个内源信息,在这个本地内存当中,也是我们当前这样的一个变化是吧?嗯,分配在这个本地内存当中,而且呢,会移除字面量的这个字符串,也就是说我们这个字符串常量池当中的这个字符串,还有我们这个类的这个静态结构呢,到我们这个啊Java hi,哎这块呢,你看写的非常清楚,我在这里边呢,也特意的加了两条红线,就是在我们这个,呃,Jdk Oracle这个官网当中,这已经写的非常明确了啊,但是在咱们这个,呃,很多实际的这个。
24:01
中文的这个帖子和书上呢,这块呢,写的并不清楚啊,就是我们这个啊什么呀,诶在哪呢。在这呢是吧,就是我们这个字符串常量。这儿还有我们这个静态的变量啊,是在我们八当中呢,还是放在这个堆当中的啊,然后下边呢,就是我们这个house bar的虚拟机,它显示的分配并且呢,释放咱们本地内存给我们这个乐源信息,也就类源信息呢,还在我们这个本地内存当中啊,然后呢,这个分配给新的这个类的这个类源信息,它呢受限于咱们本地内存可获取的这个资源,而不再呢使用我们原有的这个max pro size来进行控制。啊,这个也很清楚是吧,不管呢,你是使用这个具体的这个标准,还是说呢,使用这个命令行来演示都一样,哎,就是我们此时的这个原空间里边存放的这个人元信息,仅受咱们本地可获取的内存的一个限制。啊,我们就较少的会出现这个JC对吧?哎,较少的会出现这个JC,你也不用刻意的去设置我们原来这个像UU的这个上限了啊,而且呢,我们少出现这些呢,调优的话呢,其实也用不着频繁的去出现forc了啊,那整个呢,运行的这个效率啊也会更好一些,OK,这呢就是我们说这样的一个过程啊,应该说的非常清晰。
我来说两句