00:00
下边啊,咱们来看一下这个方法区的大小呢,该如何进行设置,对吧?那上一章呢,咱们讲这个堆空间的时候呢,提到过,说这个堆空间设置大小的这个参数啊,有一个初始的参数,还有一个最大的堆空间大小,当然了,这个堆空间呢,我们说相对来说复杂一些,它有新生代和老年代这个比例的问题是吧?包括呢,我们还有专门来设置这个新生代的一个大小的指令,还有呢,这个新生代当中的伊甸园区和survivval区的一个比例,包括呢,新生代与老年代的一个比例等等,这个参数呢是比较多的,那咱们这个方法群呢,相对来说就要简单一些,因为呢,它就是整体上这一块空间。对吧,还是这个问题好,那么关于这个方法区大小的一个设置啊,咱们在这个Java虚拟拟规范当中,咱们那会儿也看到了,主要呢,是在这块来讲的。嗯,看一下说呢,这个方法区啊,它可以设置成是一个固定大小的,固定尺寸的一个这个大小的一个空间也可以呢,设置成是一个,呃,是不是自动的一个增长的,哎,当你需要更多的计算空间的时候呢,我们就给你增长,然后呢,当你这个更大的一个方法区呢,变得不那么需要的时候呢,我们还可以有一个自动压缩,这呢就相当于是一个自动的一个,诶内存的扩充和压缩的机制也可以呢,设置成是一个固定大小的,对吧?诶这写的是非常明确的,那咱这呢,主要关注一下就是如何来固定的设置这个大小。
01:19
啊,因为你要说让它自动的话呢,你就不用设置了,对吧?行,那这个OM呢,自然而然的就是当你超出了这个方法区能够承载的这个最大的一个值的时候呢,就会报这个OM,行,那我们来看一下说方法区的大小呢,不必是固定的,那扎虚拟呢,可以动态调整啊没问题,咱们刚才也说过了,行,那由于说我们这个方法区呢,具体落地实现啊,针对咱们说这个houseor虚拟来讲,在JDK7及以前呢,咱们称为呢叫永纽带,诶这个八呢及以后呢,我们称为呢叫原空间,所以呢,此时咱们设置的这个指令啊啊有所区别。在这个七七以前呢,我们叫pro,这个最大的这个上限呢,叫max pro。
02:00
这个初始的这个永久带的这个值呢,我们是20.75,这个等一下咱们可以演示啊,然后这个最大的一个永久带的大小呢,针对于这个默认情况下,针对于32位的机子呢,是64兆,64位机子呢是82兆。嗯,就是这样的一个空间大小,那如果说你要超出了这个最大的这个UN纽带的空间大小呢,我们就会报这个叫pro space这样的一个OM啊非常好理解是吧?行,那下边呢,咱们来给大家演示一下,看看如何去理解,还是针对于咱们刚才写的这样的一个简单的程序,针对这个程序,这个程序呢,我们把它呢抛起来,注意我现在呢,故意是这样子的,大家看一下当前呢,咱们这个module的话呢,我用的是八的这个JDK,然后呢,咱们的运行的环境。针对于咱们当前这个method area啊,这个运行,我这呢用的也是1.8。我用的都是1.8的环境,在1.8的环境下,咱们看一下,好,我把这个程序呢跑起来。抛下来以后呢,咱们再通过这个命令行的这个工具,首先呢是GPS看一下我们当前的这个进程,OK,然后下边呢叫结音符,诶这个flag,接下来呢,我们想看一下这个叫PM。
03:09
Size,然后再后边呢,是咱们当前这个进程号10856。好一回车啊行,当然呢,这时候会发现呢,我们提示说没有当前的这叫pro,那确定的一点就是我这块呢,没写错。就焦化pro size,那为什么现在我们看不到呢,这呢就主要原因是因为我们这个pro size在这个八里边呢,已经不可以被使用了,我们把它呢CTRLC一下,大家呢,来看一下咱们这个诶扎询机的运行的这个参数列表。可以使用的这个参数列表,咱CTRLF,哎,我这呢把它呢,诶粘过来是吧,粘过来以后呢,我们直接做一个回车L,这时候呢,大家会看到pro size这里边提到了,说呢,它是以这个BAT呢为基本单位的。然后呢,说在我们GTK8当中被depreated了,就是相当于我们是被这个过时了是吧,所以呢,我们就不能够使用替换成谁了呢?替换成叫Meta space size,那对应我们说这个max pro size一样,也是呢,替换成叫max Meta spacece size,这个很好理解,相当于呢,就咱们在这个八的环境下呢,咱们已经不能够再去使用这样的参数了。
04:19
哎,这个大家应该能够清楚这个问题,好,那要想呢,大家能够去演示这个,其中这个参数的一个默认值,那你呢,需要把这个改一改,九当中这块我们改成是一个七。让他在这个七的这样的一个编译环境下,OK,这是一个,然后呢,我们再调一下咱们这个字节码文件来去运行的时候,这呢,我们改成是这个七。这个不用教大家吧,这个怎么就有期了,你把那个JDK7的那个环境呢,JDK呢装一下,然后在这呢做一个添加就可以了。啊,真的是这个七好都改完以后的话呢,我们再做一个矩形。现在都是这个七的环境了,此时的话呢,我们再接着啊接,然后接infer啊,这个我直接呢,就。
05:05
哎,这样调啊,我们此时的这个进程呢,是10044。诶,这呢就能看到了是吧,诶就是你需要在这个JDK7及以前那个JDK版本的环境下才能看到,那么这个数呢,具体是多少呢?我们来调一下这个计算器。嗯,21757952。诶,我们呢,让他出一个1024,再出一个1024,诶正好呢是20.75没有问题,那咱们这块呢,写的是不是也是2.75啊行嗯,然后呢,再接着我们看一下这个另外一个参数啊,接一份我们这呢,前面加上一个max。那就是最大的一个永久带的一个大小,那把这个数呢,我们也算一下。8598。这个3232除以10241024,那这个呢是82兆。
06:06
没问题是吧,这个呢,都是咱们实打实的算过的,也就是说呢,默认情况下呢,这个呃,我们所谓的这个永久带呢,这个GDK7之前那个版本叫永久带啊,20多兆,最大呢80多兆啊这样的情况超出了的话呢,超出我们这个max的时候呢,就会报这个诶proment OM行,那么再回过来,在咱们这个GDK8当中呢,刚才也看到我们这个参数列表了,说呢,替换成叫Meta space size和max Meta space size换成这两个参数了。那这两个参数的话呢,大家如果想在这块演示呢,那你需要呢,把刚才咱们这个环境呢,是不是做一个调整。哎,这个咱们翻来覆去的改,首先呢,把这个位置呢,调成是一个八,当然八之后呢都可以。然后呢,在这个位置找我们这个配置的环境,改成呢,是这个八及以后的这个版本。啊,这就可以了,然后此时呢,你再把它抛起来。抛起来了,抛起来了,你要想看,那你就在这看呗,首先呢,GPS,因为此时我们这个进程呢就变了,然后呢,再去调我们这个J音符,此时我们想看的这个,那具体的参数呢,咱们叫Meta space size啊,当前的这个进程呢,是一万一啊。
07:18
OK。那这呢就出来这个数了,大家呢,也可以去计算一下,21807104。诶然后它呢,去除一个啊1024,再除以1024,好这个呢是20.79啊,所以这块呢是一个约束啊,是21兆,那注意这块呢,想说的些情况呢,就是说咱们这呢依赖于这个平台,因为呢,咱们此时的源空间呢,用的是本地内存,那你本地内存呢,跟操作系统呢就有关系了,所以说我们在Windows系统下呢,它是21兆,然后呢,这个max ma达spacece呢叫负一,负一呢并不是说没有值啊,它的意思呢,表示的就是没有限制的意思,它的限制呢,就是我们这个本地内存空间的你的最大值就作为咱们这个max麦达spacece size的一个上限,诶这是说的这样个情况,那如果说你要是超出了咱们本地内存的话呢,这呢照样呢会报这个OM,它那叫metapace是吧,很好理解,行这呢是我们说的这个默认情况如何呢?去查看,那如果说大家想显示的设置呢,那你就需要呢,在我们这个参数这块呢,做配置了。
08:25
在这来配对吧,那这个配置的话呢,咱们在这稍微的也写一下这个JDK8中。或者G8级以后这个版本呢,咱们是杠X这呢叫me。Size这样,那直接在这写100呢,还是怎么整呢,这块呢,是我们后边呢讲呃,下屏的时候就是GVM的一个性能监控和调优,到时候呢,我们会讲这样一些参数到底怎么去写,它的一个规则是什么啊,到时候咱们会说,那现在呢,如果大家不会写的话呢,你就这样,你把这个参数呢,首先CTRLC一下,然后找到咱们这块,诶CTRLV诶做一个回车查询一下。
09:07
嗯,查询一下,这两还都不是我们想要的,但基本上你也能看到这个具体这个情况了,是吧?诶在后边这块呢,写个等号啊,等号后边呢,写上你具体的这个size大小,不是呢,直接写到这儿的,不能直接写到这儿,这呢得有个等号,那这个规则是什么呢?这个咱们后边再讲啊简单来说呢,就是这呢属于这种赋值操作,所以呢,我们用的是等号,前面呢,咱们也见过,是不是在这块写一个加号,写一个减号等等是吧?比如说这个加上叫PC这个print j c details,就是是否使用这个呃显示呃JC的一个详详情包括呢,我们是不是使用了叫空间分配担保啊,是不是使用这个T,这个AB啊等等,这呢都是加减是布尔类型的,咱这不是,咱这呢是一个赋值的啊,所以呢有一个这个等号行,这呢就是你不会用的话呢,大家现在呢就直接呢来这块查我们这个参数列表就行啊这呢是设置了一个初始的情况,然后呢我们在后边CTRLV把这呢改成是一个max。
10:04
那就可以了,我们设置这个初始值和最大值呢,都是100兆啊,CTRLC一下,我们在这一块来做一个配置啊,CTRLV,那写上以后的话呢,我们做一个apply应用。嗯,然后此时呢,我们做一个执行。哎,这就跑起来了,就是如果呢,大家这个参数你要写的不对的话,比如说你这块少个等号这块呢,就给你报错了红色的信息说呢,他人不认识你这个参数,这个怎么设置的,哎,如果呢,没有报错呢,说明你这个设置呢就没有问题,行,那完事以后呢,咱们再回过来在这呢做一个查看,首先呢JPS看一下当前这个进程,然后呢,我们再查看一下当前咱需要的这个,诶me达space size是多少啊10224。啊一回车行,那这个时候呢,大家基本上一看,应该有这样的一个感觉啊,它应该就是100兆了。1048。
11:01
57600。哎,除以1024啊,再除以幺零二四一百兆没问题是吧?行,那这个最大的这个max位置我就不测了啊,这个我们都设置过了,肯定都还是100兆,行这呢就是我们说明的这个问题,就是该如何呢去设置咱们这个参数啊,OK啊这就过了,那么在咱们这个JDK7。啊,这个以前的这个情况呢,咱们刚才说到了,是不是这样的参数啊,诶杠X冒号,然后呢,第一个呢,叫做a size。这个呢,要要我们设置的话呢,是不是也是后边有一个等号是吧,100兆,比如说啊,然后呢,这个杠XS冒号,这个叫max。Size啊,也是比如说100兆行就这样写就行,那么顺便呢,咱们给大家说一下,如果呢,咱们在这个八的环境下,我现在要是设置这个七的参数呢,会如何呢?刚才说了是不是叫过时啊,咱们试一下啊,在这块我们此时去修改参数,把它呢CTRLV改成是我们这个叫pro啊max pro在八的环境下走一下。
12:15
嗯,这块没出来是吧,嗯,没出来啊,这个主要是显示没出来,为啥显示没出来呢?是因为咱这块呢,有一个这个嗯,1000秒的这样的一个停顿啊,大家把这个停顿时间呢,给大家稍微注释一下再来。嗯,这里就能看到了,咱们这两个参数在八当中被了他写的非常清楚。行,这个大家注意一下这个问题就行啊好,那这块呢,咱们再稍微再多说一句,你看我这个PPT里边写的这个文字呢,稍微多一些,这呢想说明什么问题啊,就是说对于咱们这个诶,让它自动的去扩容这个圆空间的这个情况,咱们呢是这样来规范的,那一般情况下,咱们确实这个大家注意啊,一般在开发中的时候呢,咱们一般情况下顶多呢,你设置一下这个ma达space size,一般呢,咱们不会去限制这个叫max麦达space这个size了,这个就一般不改了,行,那么这个Meta space size的话呢,我们设置一个值之后呢,有可能诶后边呢,它还会不断的变化,那怎么去理解这个过程啊,大家来看。
13:15
说对于一个64位的服务器端的gbm来说,它的默认值呢,是21兆,这是一个初始的叫高水平线,不是说这个直高啊,它这个这个我们叫法呢,就叫做高水平线了,说一旦呢,触及这个水平线的话呢,我们就要执行这个叫forc,就是你要超出了我们这个21兆呢,我们就要执行forc,它就要回收我们没有用的这个类,包括呢,这个擂台加载器,那这个高水平线啊,说要被重置,重置的意思就是说我们要重新给它设置个值,那这个值呢,是多还是少呢,取决于咱们JC后释放了多少元空间,如果呢,你释放的空间不多,这时候我们要把这个值呢提高,这个提高的话呢,我们就是增这个把把这个初始的这个值呢增高。当然呢,你肯定不能超过我们这个max的这个值了,对吧,那如果说你要释放空间比较多,那说明呢,诶你这里边类加载的时候呢,好多类呢都没有用,那我们就适当的还可以降低该值。
14:07
诶这要注意一下啊,那这呢,我们通过这个过程呢,得到一个结论,就是说如果呢,初始化呢,咱们这个高水平进啊设置的比较低啊,那低的话呢,就是很容易呢,是不是就触发GC,那触发GC呢,比如说给你调高了一会儿又触发GC又调高了,所以导致呢,我们这个就有可能会出现很多次调整的情况,那每一次调整对应的就是一次for g c,那咱们尽可能的是不是避免少避免出现这个GC啊。啊,为了避免频繁的出现for这些建议呢,大家把这个Meta space size这个初始值呢,咱们可以设置的稍微的大一些。而这个上限呢,咱们一般呢,就让它维持默认值,就受你本地内存大小的一个限制就可以了,哎,这呢是咱们的开发中的一个经验啊,行这块呢,大家注意一下。
我来说两句