00:00
好,那接着的话呢,咱们来看一下这个第二步啊,第二步呢,叫做堆栈方法区等内存大小的一个设置,哎,这个呢,应该是咱们讲这个内存里边用的比较多的啊,这个在面试当中也经常会被提问到,里边呢,这些相关的一些指令呢,需要大家去熟悉的啊,那这里呢,我都梳理出来了,常见的这样的一些这个GM这个选项参数啊,咱们从上往下呢,给大家稍微过一过,哎,我过的这个过程当中啊,大家你该记的你就记一记啊。啊,也算是一个梳理了。好,第一个的话呢,这个叫占啊,这个占的话呢,叫呃杠XSS啊,刚才我们其实讲这个呃类型的时候呢,其实也提到它了,是吧?它是我们对应的另外的一个呃相当于一个缩写或者等价的一个关系是吧,叫thad sta size啊,这个叫呃叉S呃叉SS是吧?就这个哎相内呢,这里边哎我们把它收起来,看看大家能不能默写出来啊,它呢,就等价于。哎,你看你自己能不能写出来啊,哎,这个等价于什么呢?首先呢,我们说这个叫杠XS是吧,然后冒号啊这些都有啊,对于波尔类型呢,就是加减,那我们这呢,显然不是,这个呢叫做哎th stack是吧,Size哎这呢是非波尔类型的就等号,然后128K啊是不是就这意思啊,所以呢,它跟我们这个命令呢,它是一个等价关系啊这个注意怎么去写,咱们前面这个讲过了啊,属于这个类型的啊好,然后呢,哎这个就过了啊,这是设置这个占啊,一般情况下呢,我们其实呃比较少的这个机会呢,去设置这个站啊,因为站的话呢,通常它这个直接呢就出站了是吧,哎,就是站里边呢,我们不涉及到这个JC的这个行为啊,站里边是没有JC的这个该入站入站,该出站出站啊,当然呢,没有JC不意味着这个站呢,不会移出啊,咱们不也会那个sta flow嘛,对吧?哎,这个应该清楚啊好,然后呢,我们看这个堆这呢,也是我们最感兴趣的,最关心的,也最需要设置的这个区域啊。
01:54
呃,首先的话呢,涉及到我们这个堆空间的一个初始大小和这个最大值啊,初始的一个最大小和这个最大的一个最大小,这个呢,通常我们这个可以考虑进行设置的一个区域啊,至于说呢,你是使用上面这个指令还是使用这个左边这个这这个还是还是使用这个的,呃,就是稍微麻烦一点,这个写法还是用这个简洁的,这个无所谓啊,这个都可以的啊。
02:16
好这就过了,然后下边这个呢,哎杠XMN来注意这个设置的叫年轻贷。啊,年轻的有的同学呢,这个不熟是吧?嗯,这个你在这块呢,也可以去搜索一下啊,啊这个XMN啊,就它来设置它是吧,它呢,是不是这里边提到叫new size是吧?来提到这个,你看上面这个写的啊说呢,这个去设置一下我们初始的一个size啊堆空间的这个是不是young generation啊,他说呃,哎,可以用这个单位啊,这都说到了啊。呃,说这个样空间呢,它的一个呃样区的,它的一个region的一个设置啊,给我们这个形成对象的,哎怎么怎么着,下边是不是有对应的这个一个说明是吧,哎没问题啊好,那么我们再回过来。这个呢,是来设置咱们这个叫做呃,年轻代的一个大小的哈,说官方推荐啊,我们把它设置成整个堆大小的3/8,哎,3/8,那这儿呢,就涉及到我们推空间呢,通常我们说的就是新生代和老年代呗,对吧,哎,也就是我们来设置有一个概念叫什么。
03:17
哎,叫这个new ratio是吧,这个new ratio的话呢,相当于我们就来设置一下这个新生代和老年代的一个比例了啊,这个比例的话呢,默认值是几啊,还记得吗。哎,这个默认值是不是二啊。呃一个呃一个一点区,两个S外区啊,这个是年轻贷啊,就是合在一起呢,叫年轻贷了,诶它俩的默认的比例呢是二啊你看我们刚才启动的这个里边,大家呢,是不是在这也可以找到哈,呃叫呃new racial。这个是吧,你real啊。哎,找一下。New。呃,瑞手哎,你看这是默认值,这个是二,也就说一份新声代啊,然后呢两份,呃大小的这个就是大小的比例呢是呃一份的是它,然后两份的这个呢,相当于是这个老年代啊,就这个意思啊,我们这块要改的话呢,你可以根据实际情况呢,做一个调整就可以了啊,比如我们这个新生代这个对象比较少,直接呢,我们就老年代的这对象比较多,我们就可以给老年代分配再带大一些是吧。
04:20
好,这是这个啊,然后这块推荐呢,我们设置的呢,诶刚才提到了说是这个3/8是吧,还这套啊,然后这个呢,是设置这个年金贷,然后下边这个new size是不是也是年龄带啊,New size还有max new size啊,都是设置这个,呃,年龄带的,那上面这个指令跟下边这俩是什么关系呢?我们看看这里边有没有这个给我们的一个指示哈,嗯,这是我们找一下这个。哎。X叉是吧,哎叉。MN。这个我们重新再这样搜索一下啊。哎,找到它,找到它以后的话呢,大家你注意看我们这里边儿这个描述啊。哎,你看这啊说呢,Instead of,呃杠XMN这样的一个行为呢,它去设置boths啊,这个初始化的以及最大的一个size啊,相当于我们可以呢,去拿它和它合在一起呢,去替换啊压G呢,就是我们这样一个操作的话呢,就把这个呃初始的一个年轻带的大小和最大的一个年龄带大小呢都给做了一个设置。
05:22
啊,相当于它俩呢,合一起是不是就类似于它呀,哎,这个意思啊,好,下边呢,叫做urvival ratio啊survival ratio就是我们来设置这个伊甸园区和我们的这个survivval区它的一个比例,这个默认值呢是八对吧?哎,这个默认值是八,诶这个呢,包括下边我们这个刚才提到这个adaptive size policy啊这个呢,咱们需要给大家呢,再啰嗦两句啊,什么意思,注意听啊,大家注意听,现在的话呢,我们,哎,针对于咱们当前这个代码啊,哎,我把它呢再重新做一个设置啊这个加上也行,我把这个数呢改成这个600。啊,这个数的话呢,我们方便这个去计算啊。
06:01
改成600了是吧?好,后边这个呢,暂时咱们先给它都删掉,诶我们这相当于是不是光设置一些这个堆空间的一个最大的一个大小,对吧,刚才呢,我们提到了是不是默认值呢?哎,这个新生这个伊甸园区啊,和我们这个survivor区两个嘛,S0S1啊它是八,那就意味着有八份它啊一份它一份,它一共呢,相当于是就十份呗。好,那我们默认的话呢,这个new,呃,Ratio是吧,New raal呢,咱们是一个二,呃相当于我们有600兆的这个空间啊,这个我们这样这样写一下啊,呃,600~600啊,这个里边我们说默认情况下啊,这个新生代啊占。哎,占是不是这个1/3啊啊,那也就是说我们有这个是不是200兆,哎大小啊,哎,这是默认情况下,它,然后这个老年代。哎,这。哎,2/3。啊,那这个呢,就意味着有这个400兆空间啊,那么这个新生代中,嗯,新生代站是吧。
07:00
这个啊。哎,那这个其中啊,这个伊甸园区啊,它呢默认。哎,是不是这。哎,占我们这个新生代的啊,是不是叫8/10是吧。那要十分8/80的话呢,那我们200,那就是不是160兆是吧?哎,然后呢,这个survivor区。哎,Survivor这个零,哎,Survivor。啊一啊是不是各占。哎,各占这个,哎新生代的,哎1/10是吧,哎这呢就意味着是20兆对吧。保存一下行,这个呢,就是我们说的这个,哎,默认的一个行为,好,那现咱现在呢,把这个程序呢,给它抛起来啊。抛起来了,抛起来以后呢,首先我们来看一下这个所谓的默认值是不是这样,哎,咱们找一下这个呃,Survivor raio,哎,这个是八没问题啊,确实呢是八啊,嗯,这个是八了,那他们这个呃值到底是不是我们这里边看到这个数据呢?哎,咱们有一个比较直观的,咱用一下这个叫哎微收VM是吧,好,大家把它打开。
08:08
打开以后呢,我们选择这个OM test。双击是吧,然后有这个诶微寿GC好,大家这时候来注意看啊,咱们这个新生代和老年代这个比例,你看这个是150,加上这块这其实就是200了呗。啊200是吧,然后呢,跟我们这个old呢,这块是400,确实呢是1:2啊,这个是没有问题的啊哎,这块呢是一,嗯,它呢这块呢能够占这个二的这个空间啊OK,行,这个比例呢没毛病,然后的话呢,当然你再看后边这块呢,就有问题了啊这个一点进去的话,你看这个是150,这个是15,这个25,你算一下这几比几。啊,这个是乘以六,所以这这是不是6:1:1呀。对吧,哎,6:1:1,诶怎么会出现这样的情况呢。对吧,诶,我们说这个默认值是八啊,然后在这块看到的也是八。啊,也是八是吧,书上告诉我们是八,我们打印出来也确实是八啊,但为什么我们这个实际的这个比例却不是八呢?哎,这里边大家注意有一个原因造成的啊,这个在面试当中,或者大家呢,你去呃跟别人去交流的时候呢,我觉得啊,你可以把这个呢当成是一个呃挺隐蔽的一个问题啊,你跟他做个交互,你看他会不会啊,就知道它这个底子咋样啊,这里边呢,涉及到一个参数叫做use adaptive size policy,默认情况下呢,这个参数呢,是开启状态的。
09:25
哎,开启状态的怎么证明呢?那你看我们这看这是不是可以,哎,或者的话呢,大家打开这个命令行,是不是在这块我们做一个演示也行啊,哎,比如说现在呢,我接。没问题是吧,GPS以后呢,我们来一个叫解符杠flag,哎,这个我们叫use Di。呃,T啊size,嗯,我现在想看一下它具体的这个是不是开启状态是吧,针对的是20136啊这样一个进程。好,我写错了啊,那又是呃。
10:00
Adaptive。啊,Use adapt啊,Policy是吧,还有一个啊。啊poly啊C是吧,好,这时候大家你会发现呢,我们这个参数呢,现在是不是一个加号,言外之呢,就是我们现在呢,呃处于一个开启状态啊,在咱们这个GD8当中啊呃默认的使用是power jc,它是一个开启状态,言外之意就是虽然我们这时候的啊解呃,In for-flag啊我们叫呃,Survivor。啊,Racial啊,20136。这呢,我们虽然看到这个值是八,但是呢,其实这个八并没有启用。啊,为什么呢?因为我们这个参数呢,是一个开启状态,那么你开启的时候呢,它就会自动的进行这个ED区和survivor区的一个比例的分配。啊,比例又分配啊,这呢也是我们为什么推荐大家打开的一个原因啊,就是这个呢,参数其实就失效了,你说是不是八呢,其实是吧,只不过呢,它现在失效了,对吧,那你怎么保证我们这个八呢能够启用呢?啊那非常简单啊,大家能想到吧,是不是我们就把这个参数给它关掉就行了。
11:06
哎,来回到我们这个位置啊,咱们在这艾这个位置啊,比如说现在我们去杠XX,然后冒号,哎,咱这是一个bird类型的时候,整个减啊,哎叫use。啊。下。Policy是吧,诶当我们把这个参数呢,给大家设成是一个减的时候呢,你看apply啊,OK一下,好,这时候我们再把它抛起来。划掉以后呢,这个时候你在这看那个参数,其实这时候看不看都无所谓了啊,肯定是不是还是八呀,因为我本身也没有修改它对吧?诶你看还是八啊,这个是八了,诶你看大家这时候注意看啊,哎,我把这个关掉了,因为我们又重新运行了嘛,打开好这时候我们看下这个微瘦JC好这时候呢,大家你再看。这时候大家会发现呢,这个比例呢,还是6:1:1,诶那不对呀,哎,我们已经把它关掉了,怎么还是这个6:1:1呢,哎,按说应该是八了,哎这时候呢,注意如果呢,你要是把它给关闭掉的话呢,哎这个时候你要小心了,我们要想让这个哎使启用是吧,当然这个这个到底有没有这个启用了呢?其实我们也可以呢,在这先做一个验证啊,哎解infer,然后呢当flag,哎我们叫a use。
12:18
啊,又是AA adaptive。啊,Size。哎,Policy,哎,针对二这个我们叫9156。哎,这个一回特好,这时候我们确实呢给他禁用了是吧,当然禁用以后呢,你发现它这个比例呢,还不是我们想要的这个八对吧,对吧,诶怎么办呢?诶这时候你要想让它启用,注意呃,你还必必须呢,给我们把这个参数给它加上啊,哎,叫做这个呃suror。Real是吧,哎,这个把这个值呢调成这个八,哎,此时的话呢,你把它OK掉以后呢,我们再去做一个执行。
13:00
哎,我又跑起来了啊,这个时候呢,你要在这里边去看呢,其实你看survivor ratio,它前边survivor ratio ratio。在这在这啊前面呢,你看就加了一个冒号,等于因为我们显示的给它赋值的赋值是八了哈,哎,当你这样写完以后的话呢,哎,我们这时候你再来看它肯定是不是就是我们想要的那个八比比了。哎,你看这时候就是了是吧,哎,这时候才是,呃,言外之意什么意思呢?就是我们总结一下啊,呃,我们要想这个默认的这个8:1:1呢,呃有效啊,相当于咱们还得是不是要显示的把这个比例呢写出来是吧?哎,然后这个呢,通常我们就禁用了,哎通常就禁用了啊那有同学想说,哎,哎,那宋老师如果说我们把这个也打开的话,是吧,我这也写成加了这个也开着,这个时候会是什么情况呢?来,我们跑一下。啊,跑一下。哎,这个大家能猜到吗?啊,你能猜到吗?来我们把它打开来走一下啊,看这时候呢,是不是也是咱们显示的定义的8:1:1了,是吧?哎,也就是说呢,如果我们显示的定义了啊,就是8:1:1的话呢,那它一定以你这个为准啊,以你这个为准,如果呢,你这要是没写的话啊,不管前面这个use adaptive size policy开或者没开,那它其实呢,是一个自动调整的,那默认情况下呢,其实是一个6:1:1的一个情况。
14:22
啊,这个大家呢,稍微注意一下这个问题啊,这个呢是非常细节的一个点,好这个我们再这个拉回来啊,呃,这个呢是我们说的这两个参数啊,这个最后的结论是什么呢?就是建议呢,大家是把这个给它打开的啊,建议你打开,然后这个呢,大家就别设置了啊,就让它自动的这块去做一个调整就行,这样的话呢,它会满足我们目标的那个,呃,叫什么呀,响应时间啊,它会尽量的去满足这样的一个,呃,这个指标,然后呢,会自动做一个一电园区和外区的一个比例啊,建议呢打开啊。下面这个new raal呢,就涉及到新生代和老年代这个比例默认的是二啊,这个你也可以去修改,这个根据实际大家这个程序的情况啊,你是本身呢,就有大量的这个数据呢,是生命周期很长,那你就让这个老年代是不是要大一点,没必要在新代里边颠倒过来,颠倒过去,然后再去老年代,直接呢就蹦到老年代就完了,是吧。
15:13
啊,那如果说你这个大部分对象呢,都是在这个新生代来维护的话啊,那你这个这个年龄贷来维护,这时候你就可以把这个比例呢,是不是降的小一点是吧。让行星代率要大一些啊好,后边这个呢,涉及到了说是这个值,这个我们还稍微用的少一些啊,是个临界值,说设置了让大于这个阈值的对象呢,直接进入老年代啊,单位呢是字节,诶这个呢也是在一些特殊场景下啊,你确定这个对对象这么大的,它就是个生命周期很长的,我们就直接呢让它蹦到老年代啊,避免了这个样JC是吧。呃,但是呢,它只针对这两个,这个垃击回收器是有效的啊呃,下边这个呢,我们比较常见啊,这个max tuning啊,Shold就是,呃,我们从这个新生代呢,这个对象是不是颠倒过来,颠倒过去从survivor里边这个达到这个15的时候呢,是不是就把它呢?诶转移到这个老年代了,是吧,这是一个默认值是15啊,这个大家注意一下。
16:03
嗯,这个通常一般咱们改动的也少啊,改动的也少好下个呢,呃,这个是让GM每次这个mini GC之后都打印出当前使用的这个S法中的对象的一个年龄分布啊,年龄的话呢,就是我们上面说一开始呢是这个呃比较小的零一是吧,然后呢,一直到这个15,超过15呢,就到了我们这个老年代了啊这个呢,可以打印一下这个分布啊,下边呢是一个目标的survivor的一个raio表示呢,就是样JC之后啊,或者叫MJC之后呢,Survivor去占用空间希望的一个比例大小啊这呢可以做一个设置。好,这呢是咱们针对这个叫锥空结啊,然后针对这个方法区的话呢,JDK8之前我们叫云有带啊,后边我们叫这个圆空间了啊,这是这样一个情况,呃,当然这里边我把这个啊,压缩类啊,这个相应的也都往这块来放了啊,压缩指针等等啊呃,Meta space啊,这是我们设置这个JDK8的时候呢,这个圆空间的大小啊,之前的话呢,叫pro啊mass pro是永久带的意思啊。
17:06
OK,诶,默认的这个值值的大小啊,这个呢,可以稍微的了解一下啊。然后呢,呃,是否使用这个压缩对象指针啊,压缩类指针啊这块呢,使用这个布尔类型的就加啊,不使用就是减就行啊呃,然后还有我们这个是这个class Meta space,它的一个大小默认的是一个G。默认是一个G直接内存啊,这个咱们也前面提到过,这个JD8之后的话呢,我们这块使用的就是属于这个呃方法区,我们默认源空间的相当也是用的是这个直接内存这个大小是吧?这个呢,如果没有指定,就跟咱默认的这个呃,系统这个堆大小呢是一样子的啊好,这里呢,就是咱们整个设置这个堆啊,这个内存当中相关的比如堆方法区占啊一些相关的一些这个指令啊,那这块指令呢,需要大家呢去熟悉。啊需要去熟悉,后边呢,咱们谈建议大家呢,一个设置是多少,诶咱们在后边这个具体的案例当中呢,诶给大家做一个说明,好这块呢,关于这个内存这块呢,咱们就可说到这儿啊。
我来说两句