00:00
那刚才呢,咱们讲完这个站当中这个会存在异常的问题了,说他呢不需要JC,但是呢会存在异常的情况,那紧接着呢,咱们就问一下这个问题,面试当中可能会问说开发中你遇到过哪些常见的异常呢?对吧,有哪些常见异常呢?诶,如果大家呢,刚开始学习Java,你可能会说,哎呀有控制人异常啊,脚背界异常,脚背越界异常呀,类型转换异常啊等等都可以,但是呢,如果是已经有,比如说两年多的开发经验了,再问到相关的这异常,这时候呢,大家再答的话呢,就应该答的这个高大上一些了,呃,要么呢,比如说是实际开发中框架中的出现一些情况。呃,就是呃,你开发中的一些问题,我们也都可以归到这个异常这里边啊,那要么呢,就是这块,你说再一点高大上,就是往深度上去这个延伸的,那就是提到Java虚拟机当中会出现的一些异常,那Java虚拟机中出现异常典型的就是内存溢出啊,内存的,当然内存的泄露呢,最终也会导致内存的溢出问题,诶往这个方向去打,典型的话呢,诶就是我们这里边提到这个oom这样的异常。
01:05
哎,当然针对我们这个站的话呢,它还可能会出现叫sta stack overflow error啊,那大家呢,以后要去打这样的高级的一场啊,那在我们站这块呢,我们看一下它可能会出现的异常呢,有两个,哎,什么时候出现呢,我们看一下。说Java虚拟机啊,它允许Java站,它的大小呢,是动态的,或者是固定不变的。就是我们可以把这个Java站的这个大小呢,设置成一个固定值啊,那如果你设置成固定值以后,那线程如果请求分配的这个站的容量啊,内部呢,分配的这个局部变量表啊,这个量比较大的时候呢,超出了我们这个站能够这个允许的最大容量的,这个时候我们会抛出一个叫stack overflow哎这样的一个异常。就叫占溢出的一个异常啊,因为你固定大小了,这个时候呢,呃,你超了它就是溢出,好,那如果栅va区逆站呢,它是一个动态设置,它的一个大小也是动态可以扩展的。
02:06
诶是动态可以扩展的,并且呢,它在尝试进行动态扩展的时候,就是相当于它的内存快不足了,诶这时候我尝试去扩展,如果呢,还有空间没问题,不会出异常,如果呢,我再去申请这个内存的时候呢,发现没有足够的内存,诶这个供我去扩展了,这个时候呢,我们是内存不足了是吧导致的,所以呢,我们叫auto memory error,这跟我们后面堆也好,这个方法区也好报的这个异常呢是一致的啊,就是内存空间呢,想再去扩发现不足了,叫auto memory error。哎,是这样的两个问题。好,那上边这个问题呢,咱们演示一下啊,那打开咱们这个,呃,Idea,那在我们这个下边呢,咱写一个相关的这个练习。哎,这个新建class,咱们就叫做stack error啊,它的一个测试了啊OK。
03:00
哎,我们来演示一下这个stack overflow啊演示哎站中的。诶,这个异常情况,呃,其实这个演示的话呢,非常的简单啊,最简单的一个程序呢,就是我们在main方法里边,大家又写了一个main方法,自己调字节。啊,像这呢,我们说是叫局部变量了,对吧?诶我们这个变量呢,不断往里引用,然后再引用的话呢,又会这个产生一个局部变量表,然后来保存你这个变量,呃,这个变量会越来越多,这是最简单的一个战役出的一个异常啊,然后我们执行一下。好,大家看到我们这个程序呢,就挂掉了,诶我们往上呢移一移,看看它到底。出现这个异常信息是什么?在这呢,叫stack overflow啊,这样的一个error啊,所以这个异常的话呢,我们想演示其实是非常的简单的。诶,这样一个情况啊,只不过呢,有的时候我们可能不是特别这个清晰的能看到啊,你说这个非常的low了啊,自己只要自己,嗯,很多时候呢就出问题了,当然了,我们有一类方法就叫做递归方法,在特殊的情况下呢,我们实现自己吊自己,比如说呢,像我们的快速排序,我们就用到了自己吊自己啊斐布纳切数列啊,也自己调自己啊,自己调自己的时候呢,要一定朝着已知的方向进行,否则的话呢,就出现了死循环啊,那就会出现这个溢出的问题啊这呢我们叫stack overflow了啊呃,那这块关于我们这个auto memory呢,我们就不在这演示了,它需要呢,保证我们这个整体虚拟的内存都不够的时候呢才能出现,诶这个我们就不多演示了。
04:38
好,那咱们再说下一个问题哈,那我们在这个站当中啊,刚才提到了说可以设置成一个固定占大小的,那如何去设置这个占的大小呢?诶我们这儿呢,讲一个参数叫杠XSS,使用它呢来设置咱们占空间中的最大的占的大小。啊,设置最大的一个占的大小,嗯,那这块我们怎么来体会这个事儿呢?嗯,或者说这个参数呢,该怎么去用呢,咱们还是啊追本溯源找一下这个官方,官方呢,咱们这看到的是一个呃,Gbm的一个规范啊咱们再回到Oracle本身。
05:17
先调不调不了啊,先调到这点一下Oracle。这呢是咱们Oracle最初的这样的一个起始的页面了,三道杠进来,嗯,进来以后我们点谁呢?点这儿有一个documentation啊,就是文档。点开,点开以后呢,我们找Java。诶,再进来以后,嗯,进来以后呢,我们看一下叫Java SE的documentation。好进来这时候呢,是JAVA13,咱们可以不看这个最新版的,你你可以选择其他的版本,这个看八也行,看11也行啊,咱们比如说看11吧,这是八以后的一个LTS了。嗯,进来以后呢,我们找一下这个叫tools references reference啊。再进来这个路径有点深哈,再进来以后,嗯,不妨呢,大家就把我们这个地址啊,你保存一下啊保存一下,因为我们后边呢,查询的时候也经常会用,我这呢就存储起来了,怎么找到呢?刚才演示一下,大家可以根据这个视频呢,呃,慢动作回放一下,再找一找这个路径,那进来以后我们看一下这里边这又是一个关于我们的一个,呃,使用文档的一个说明啊,在第二项里边有一个Java。
06:29
那点开。有同学说,老师你怎么找着的这个?嗯,那就找着了是吧,这个其实也看一些帖子啊,这个其实就找到了,呃,当然了,关于虚拟机这块呢,大家看帖子的时候呢,一定要呃,带着这个这个怀疑的眼光来看哈,就是网上很多关于虚拟机这块相关内容的一些说法啊,都是错误的啊,所以这个大家一定要小心一些啊,那进来以后呢,我们在这儿呢,CTRLF去搜索一下啊,就搜索这个杠XSS啊,就搜它啊,然后回车一下啊这呢,我们就找到了这样的一个参数,那这个参数的话,我们就是来设置一下咱们stack占的一个size大小的,这是以BA字节为单位的啊。
07:13
那如果你要是希望以这个呃千字节为单位呢,你就加上一个K,希望呢,以这个赵字节为单位呢,就加上一个M,小写大写都行,那这个GB的这种呢,你就是加个G就可以了,哎,非常好理解啊,那默认情况下呢,像Linux这个,呃,苹果的这个Mac操作系统,还有Oracle的这个salaries啊,包括呢,Windows是吧,它默认的一个大小是多少,这都有显示,然后Windows这块呢,说决定于我们虚拟的实际内存是多少啊,它没有明确的一个值了。那如果我们要设置的话呢,大家可以参照下边这样的一个格式来写就行啊,这呢就是我们使用这个参数呢,来设置咱们这个内存当中占的一个大小的啊嗯,那怎么证明你设置的跟没设置的区别呢,咱们可以这样子啊。
08:01
嗯,我这呢是自己调自己了,比如说我就不自己调自己了,哎,自己调自己。嗯,也行哈,嗯,在那里边呢,我们这样我定义一个。Count,这个count呢,我们嗯,这个别在这定义了。我在这儿再定义吧。Private static int型的一个count,这个值呢,一开始是一个,我写个一吧。然后一上来的话呢,我们,呃,让我们这个count呢,做一个输出。输出完以后呢,它来一个叫count加加。哎,我们看下这个程序啊,嗯,先输出这就是一加加以后呢,就变成二了。然后再进去,进去以后呢,我们再进来,那输出呢又是个二,因为我们这是一个全局变量嘛,所以它会不断的递增,我们先没设置咱们的这个占大小的情况下呢,咱们看看它输出的这个结果是多少啊。
09:02
嗯,好,已经出现这样异常了,往上走往上走。大概在这附近。诶出现了,这时候呢,打印的是,呃,11420次。啊,这呢,有我们一个站的,相当于是它的一个默认大小了,嗯,这是我们打印它的一个数值,相当于是默认情况下。哎,咱们这个count的数值啊,最后呢是这个数值,现在呢,咱们来诶设置啊占的大小,诶刚才咱们说到了使用这个指令的杠啊,大写的X啊SS,然后后边呢,比如我们设置成256K。那就这样写来行就行啊,CTRLC一下,然后我们找到这个run,诶在run这块呢,有一个叫editit configurations啊点开,然后呢,针对于是我们当前这个呃程序,诶在这个位置呢,CTRLV啊粘上就可以了,诶这呢,比如我演示一下叫256啊。咱们实际的这个占内存的大小,其实比这个要大的啊,我设置一个相对来讲小一些的,然后OK。
10:05
再来执行。不出意外呢,也出现这样的一个异常了,然后往上走,我们看他打印的这个次数。行,诶我们看到呢,目前它打印了2465次,这样我们设置完以后,它的这个诶count值呢是2000多次,那很显然呢,我们设置的这个站的大小呢,就起作用了,这个设置的站的大小直接决定了我们这个。这个异常报的一个早或者晚的一个情况,那如果我们设置这个站呢,大一些,那它就是呃,较晚会出现这样的一个异常,甚至说呢,我们在呃有些情况下啊,比如说我们程序当中顶多使用的内存空间呢,比如说我们设置成是这么大啊,你要是最多使用的内存空间呢,比如说是这么大。那我们呃,在这个蓝色的这个内存大小的情况下呢,呃去执行红色的这样的最大内存,如果需要这么大的,你就会报这个stackflow,但是如果呢,我们在呃相应的情况下呢,咱们把这个内存空间呢,这个占的哈,设置成这个绿色的话呢,你去跑这个红色的这个程序,诶发现它就没有报这个sta flow这样情况,这也是我们这个调优的时候呢,关于这个参数调优的其中的一种情况啊,大家稍微注意一下啊。
11:24
诶知道呢,能记住我们这个调整这个站的大小是通过杠S-XSS来实现的。行,那关于我们这个占里边常见的异常啊,举例包括如何设置占内存的大小,这个我们就说到这儿。
我来说两句