学会一个小技巧,解决电脑大困扰,这里是罗哥说技巧, 最近有多名网友反映呢,说了在使用 win 十系统时出现闪退,并伴随着弹出一个对话框,上面出现这样几个英文 of the, 这是怎么回事?遇到这样的现象我们该怎么来解决呢?问有什么好的方法? 这个视频我们就来说说这个问题,从上面几个英文来看,这是说内存不足,不管是运行大型软件还是运行游戏都会出现这个现象,既然提示物理内存不足,那么我们可以通过设置虚拟内存来解决这个问题,供大 参考和讨论,具体的方法和演示如下,第一步,我们首先就来查看一下我们电脑的物理内存是多少,具体的操作如下,首先我们找到此电脑右键,点击属性, 打开属性对话框,打开以后,我们可以在这里看到已安装的内存,这里我们的是十二个 g, 那么我们就调出这个计算机, 然后在这里面输入 e 十二,将它记录下来,然后我们再来设置虚拟内存。第二步,如何来设置 我们的虚拟内存,请看方法。那我们现在来设置他的虚拟内存,在刚才打开的这个系统属性对话框中,我们已经知道是十二个 g 我们的物理内存。接着我们在他的左边点击这个高级系统设置, 在打开的高级系统设置这个属性,我们找到高级,然后点击设置,然后再找到这个高级, 再找到这个虚拟内存,在虚拟内存这里点击更改再打开的这个虚拟内存对话框时,他这里是勾选自动管理所有驱动机音乐文件的大小,我们要将它取消,取消勾掉这个,然后我们选中我们的 c 盘,这里点击自定义大小,然后我们在这里输入初始大小为我们物理内存的一点五倍,那么最大值就为两倍。首先我们来找一点五倍, 我们调出计算机,刚才已经知道了我们的物理内存是十二个 g, 那么一个 g 就是幺零二四 kb, 我们就将这十二个 g c 零乘以幺零二四,乘以幺零二四, 等于幺二二八八,再乘以他的一点五倍,乘以一点五倍就等于幺八四三二,那么我们这里的初始大小就是幺八四三二, 我们就输入幺八四三二幺八四三二,那么它的最大值是它的两倍,我们剩了一点五倍是这个数,那么我们就反倍来除一下,除以一点五倍, 这就返回了这个数值。我们再将这个物理值物理内存的再乘以两倍, 等于二四五七六,那么我们就输入二四五七六二四五七六,这样我们再点击下面的确定, 然后重启电脑,就可以解决我们由于虚拟内存不足而弹出的那个 out of memory 的这个 英文提示的问题。关注罗哥,了解更多的电脑小技巧。
粉丝4.7万获赞32.0万
这是我之前在 b 站直播的时候讲过一次那些年我们遇到的 om, 然后之前就跟运营那边计划说要去开一个系列课程,详细的去讲整个关于 om, 关于内存溢出这个话题,或者是这个课题的一系列课程。 然后因为工作比较忙,所以一直都在拖更,然后这一次算是被逼着自己去开了这个坑, 这一次也是算是为这个系列课程作为一个开题,然后我也算是正式给自己挖了一个巨坑,然后后续我一定会努力慢慢的去填这些坑。作为 这个系列课程的第一讲,我们今天不会去讲具体到某个具体的 om 的错误,我们这一讲会详细的先说一下,就是说 对于 om, 对于奥特曼曼瑞这个事情,我们原先的理解,我们原先对他的一些认知是否是正确的,或者是否是准确的。然后讲到这个问题,我们最先遇到的肯定是说 到底什么是 om, 什么是 out of memory。 下面这一段是我在 vicky 上找的,在那个 cs 的一个 分类下面,他讲到了一个定义,然后啊,反正我英语口语不是很好,我会去读一遍。然后他这里讲到的是说, auto memory is often undesired state of a computer operation where additional memory can be located for use by progress or the operating system this usually accuse because all available memory including disk swap space has been unlocated。 他大意就是我下面翻译的这一段中文。然后他特意讲到的是说这其实是一种 不受欢迎的,不被乐意见到的一种计算机操作的一种状态,然后是怎样一种状态呢?是说程序或者操作系统 已经无法再申请到内存那种状态。但是这里有一点其实是大家原来可能理解上都会有偏差的,就是说召唤空间这一部分东西,很多同学在找到我去问相关问题的时候,他们直觉的会觉得就是说我内存 一出就只是针对于我插的那个内存条,也就是我们一般意义理解上的物理内存这部分空间的那个内存一出。但实际上对于 auto memory 这个错误或者说这种异常, 他其实不光是针对物理内存的,他实际上真实完全执意的一个意义是说我内存地址空间不足,而并不是说我真正的那个内存的空间不足。其实我们有时候会仔细的话我们会注意到,就是说比如说我一个只有两 g 内存的一个机器上面, 我其实去启动一个,比如说我给骄傲的一个黑谱分配四级,我其实可以起来的,只要我最后没有把这些所有的技术空间全部用完的情况下,他其实都不会爆错。这这就是因为我们其实一般 在做操作系统的时候都会去分配那个交换交换空间,然后这就是我想去纠正这方面的一些,就是直觉上的一些差异,然后跟这个真正定义上的一些差异,然后这个其实也会关系到说我们或许去看一些问题的时候,你的视角会不同, 然后就是你会关注到这一部分你没有被关注到的东西,比如说你可能原先的时候没有这个概念的时候,你可能不会关注说,哎,我这个操作系统,我的 召唤空间,我的 swap 空间,我分配了多少,然后当你有这概念的时候,你其实就会去关注这一部分内容,然后对于你去拍下问题,或者是去看这个问具体的问题的时候,会更加的直观,也会有更多的思路。 我们现在看到的这个电影其实是针对于操作系统,或者是针对于计算机整个体系说理解的 一个奥特曼曼曼里的一个概念。然后我们针对于娇啊和娇啊虚拟肌这个领域里面,那么我们这个奥特曼曼有具体是指的哪种状态呢?然后在谈论这个话题之前,其实我需要先去讲一下,就是说对于娇啊虚拟肌来说, 他的整个内存的布局,他对整个内存的管理是什么样子的?然后大家可以看到就是说我在这里放的这一个内存布局的这个图,会比你们在网上找到的大部分资料都要简单的多。 基本上你去网上搜家外的整个内存布局啊,然后整个内存的分配的时候,你都会看到一当厨师说你的所有的新生代啊,然后 s 区啊、一等区啊,然后老生代啊,他都会从这个角度去分配这些东西, 但实际上那些内容是跟具体的那个垃圾收集器有关的,其实是由垃圾收集器的算法来决定了,说我会把交往这个蓝色的部分,这个逻辑堆的部分 把它分成什么样子,但他其实并不是说整个交往虚拟机对他当前这个进程的内存的整个管理和布局是什么样子的,那其实是两个不同的维度,所以当我们去理解气息的时候,我们可能会从那个角度去 放这样一种状态,但是那个其实也是不确定的。就比如说有些垃圾设计器其实是不分贷的,其实在整个发展历史上,这种不分贷的垃圾设计器很多, 所以他并不是针对骄傲和骄傲训练基的一个内存的布局。然后我们这里今天其实是为了去理解 auto memory 这个事情, 这个东西其实并不是跟 gc 有强相关的,我们后面会讲到肯定会有关系,但是并不是完全的强相关。所以我在这里放出来的这个图是仅针对于整个教训机,他去分配一个大概的一个内存的布局状态,然后最大的一块当然就是说 我用来提供给周二语言去做对象的分配,这主要的这一部分我们把它叫成逻辑对,然后为什么把它叫成逻辑对呢?因为就是说对于堆这个概念,其实就是实际上除了占空间以外,剩下的所有的内存都是,即便这一个进程的对,但实际上就是说 对于这个逻辑的一部分,它仅仅是用来给交往事业机去做交往语言层面的一些内存分配的一个空间,所以我们把它教学时交 的逻辑对,就从这个层面你也可以去理解说为什么骄傲虚拟剂就要成虚拟剂,就是说他他跟那个 vm 味那些东西不一样,但实际上他还是一个虚拟剂,因为他 完整的去实现了基站去执行的这样一种逻辑,就是字节码其实是类似于回编和制定级的那些东西。然后第二部分橙色的这部分,我们比较老的程序员可能会知道这个叫法制,叫永久戴,但是一点八之后他其实是变成了 matesbays 圆空间这个概念。然后这部分主要是其实从圆空间这个概念就比较好理解了,从字面上就比较好理解,它其实是用来纯属一些原信息的。就比如说你的 class 的整个结构,然后你 class 名字啊相关的一些基础信息,然后 然后静态变亮,然后他的一些属性,然后接下来就是说他编以外的那些方法的那些 信息,结果信息全部都会存在这个区域,然后这个区域其实也会有很多特殊的地方,因为其实他这里纯属的跟交往对象那些东西,跟交往语言层面那些东西完全都没有关系的。 所以我个人其实觉得这部分是不属于对的,应该他跟堆有非常明显的分界。但是其实网上也有一些说法,就是说因为后续的一些垃圾搜集器都会去处理 圆空间这一部分,所以他们认为就是圆空间也是对的一部分。但这个反正大家见仁见智。但是从我们去理解 om 这个事情上面,在这个部分上他们是完全不同的,他们会有非常多的差异点。然后我们后面会讲到就是说圆空间这一部分,其实对于奥特曼某人来说,其实也是非常特殊的一部分, 他其实会建造非常多很特殊的点。然后第三个这个灰色的区域,就是 最纯粹的那个赵尔逊以及自己去使用的这部分内存空间,也是说他大概会包括比如说我的 nie two, three 的, 我的县城所占到的一些站的那些空间,然后以及我借问启动这个私家家程序启动的时候,我需要去分配的一些内存空间,我需要去分配私家家的一些全局的一些变量啊,然后一些属性执照、一些信息的存储空间都在会在这部分。然后最后一部分就是这个 office, 这个东西就是我们在骄傲和骄傲训练机这个语境里面去提的这个对外的概念,实际上就是说按照我们刚才的那些定义,就是蓝色部位以外的,我们认为他都是对外, 但其实为为什么我们要把这个绿色的 office 单独拉出来呢?因为这部分很特殊,这部分空间他其实专门用来映射 招外里面那个 direct 特巴芬那个对象所指向的对外空间。然后我们一般大部分语境上面说的对外空间和对外内存以及对外内存溢出都是指的这部分。 然后这部分他其实我们后面也会详细去讲,说说这个空间他是怎么去分配的, gc 又是怎么去回收他的。然后在什么情况下这部分处理会出现一些溢出的情况,我们后面的客厅里面会详细的去。
来看这道面的题,有没有处理过线上内存溢出 om 的问题,你是如何定位排查的?我们来说一下 om 是什么呢?内存溢出对吧?就是我们的应用频繁的发生复偶, gc 老年代爆满,无法进行回收,那就会造成内存溢出的这个异常。那面试官呢,有可能会这么来问你,当我们的服务器上面部署了,就要应用出现了 out of memory exception 的异常,那有可能是什么原因造成的呢? 又如何来进行定位呢?所以说这里是两个问题,那我们应该如何回答呢?当然,嗯,不同的项目情况回答起来肯定也是不一样,还得结合你自己的一些经验啊,以及啊, 不同的情况,我们可能使用不同的命令,使用不同的工具,都可以来定位 om。 那徐老师希望通过本视频呢,给大家提供一个普遍的这样的 om 解决的思路,以及面试的回答。好吧, 那我们首先要搞清楚 om 造成的原因会是什么呢?在这里我给大家总结了三点。第一点,有可能呢,是你的应用一次性申请的对象太多了, 就比方说有的同学去做一些数据列表的查询,他有可能呢,会一次性的去数据库把所有的数据都搂过来,那你想一下,如果你的数据量达到了千万级,你把所有的数据都放到历史当中, 那有可能就会造成内存溢出,对吧?那我们要解决这个问题呢,只需要去根 更改申请对象的数量,就比如说我做个分页,我一次性呢啊,查个十个一百个都是可以的,对吧?那另外一种情况呢,就是内存资源耗尽没有释放, 那我们经常比如说会去使用现成啊,对吧?或者说使用数据库查询啊,那么在高并发的情况下,假如说我们不断的去创建现成, 不断地去使用这个 gdbc connection, 但是呢又没有去释放,那久而久之呢肯定就会造成内存溢出,对不对? 所以说这种情况我们要解决呢,我们可以及时的去释放,比如说我们的 connection 用完之后立马去关闭,当然我们可以引用磁化的思想,对不对? 也就是我最多呢只申请,比如说一百个资源,或者说十个资源用到了这个我就阻塞不再申请了,那这种方式呢,我们就可以解决这种内存资源耗尽未释放的问题。 那第三种就是你本身应用给他分配的这个堆内存的资源就不够,无法支撑我的应用日常的一个呃操作, 就比如说我的这个应用当中,他本身就有一些比较大的对象,那要支撑我日常的一些基本的业务操作,你的堆内存如果不够的话,肯定就需要调整你的堆内存,对吧? 那针对第三个问题,我先给大家演示一下,好吧?来,就比如说我这里呢有一个简单的计划程序, 我们先把它跑起来,那里面的代码是什么,我们先不要关心,好吧?我们可以呢先查看一下当前这个应用 它的一个这个堆分配的是多少。就比如说我们运行了一个二四零八八的一个进程的抓应用,那我们可以通过机 map 干 hip, 然后加上这个进程二零八八,那么此时呢,他就会为我们打印当前这个 dr 应用,他所使用堆的一个最大的内存,以及呢你的这个新声带他使用了多少内存?空闲多少? 然后呢你的一零元区对吧?你的 slow 一 slow 二区,以及呢你的老年代,你的内存多大,使用了多少?空行多少?那么根据这些指标呢?呃,在结 和你的应用,你可以适当的去做一些调整,当然这里你得对 g m 的一些概念肯定要有所了解,对不对?嗯,这个是这个问题啊,如果你本身 对内存分配不够的话,你可以通过这个命令来进行查看,那然后呢进行相应的调整。那针对第一个问题跟第二个问题,我们应该怎么解决呢?那我们肯定得定位到对应的这个业务代码, 对不对?比如说一次性申请的对象带刀,我肯定要找到对应的验货代码,然后改一下他申请对象的数量,那么这个也是,如果我们的某一个资源没有释放,我肯定得找到对应的代码,然后呢给他及时的释放掉。所以说这个问 题我们得去定位,也就是怎么快速的去定位线上的 om。 那我们要定位 om 的话,我们也分不同的情况,第一种就是如果你的系统挂掉了的话,又应该怎么定位? 第二种就是如果你的系统正在运行,还没有 om, 又应该怎么定位? ok, 我们先来说一下第一种啊,也就是如果你的系统挂掉了,又应该如何定位呢?我们通常呢会通过一个叫做堆的档谱文件, 这样我们才可以有效的快速定位。好吧,那如果你的系统已经挂掉了,并且呢,你没有在运行你的程序的时候呢,去设置这个 gm 参数的话,那他就不会怎么样呢?这个参数什么意思大家 知道吗?他会在你的呃应用 alt of memory 的时候呢,为你导出一个堆的弹谱文件,导出到你指定的目录当中,那通过这个弹谱文件我们就可以来分析 o m 溢溢出的一个具体的代码位置, 所以说如果你没有设置这个参数的话,那你可以呢提桶跑路了,因为你无据可查,知道吧?那接下来我就给大家演示一下,当我刚刚给大家跑的这个应用,如果他内存溢出了的话, 我们应该如何的进行快速的定位,好吧,当然他现在呢还没有挂掉啊,好,大家可以看到我刚刚暂停了一下,那现在呢就 auto of memory r 内存溢出了,对吧?那如果我们内存溢出了,你没有去给他设置这 一个参数的话,那你可能呢就无据可查了。当然你有可能能够根据这个呃县城站中的信息能够追溯到异常的位置, 但是我们真正线上的这个系统呢,往往要复杂的多,对吧?因为我们会有很多的线程,所以根据这个异常是很难定位到的, 所以说,呃建议大家呢,可以将你的系统呢无脑的去设置这个参数,好吧,当然是一点啊,你一定要保证你的这个呃系统的硬盘空间够大, 因为他会记录你的系统在整个运行的过程当中所有的一些对象的信息,所以说呢,呃也是非常占我们磁盘空间的,也就是他 导出的时候呢,有可能这个文件会很大好吧,但是呢能够在你出现了 om 能够快速的定位,所以我们来给大家演示一下,好吧,那接下来呢,我们就运行我们刚刚的那个召唤程序,我先我先听一下,行吧, 这,然后呢加上我们的 g m 的参数, 那在这里呢,为了能够更快的 om, 我将我的堆的内存呢设置为了十兆,那么这样就能够很快看到我们的 om 的异常了,好吧, 然后呢加上我们刚刚所说的这两个关键的参数,也就是在内存溢出的时候呢,会帮我们导出堆的弹谱文件到指定 的目录当中,那在这里呢,我们就指定到当前 home 这个文件夹的这个 g v m logs, 好吧,我们就用相对路径, 然后落个四啊,当然你也可以指定这个文件文件的名称,如果你不指定的话,他会根据你当前这个应用的进程生成一个文件,好吧,我们就不给他指定,然后呢干架去运行我们的 g m ganzam 回车, ok, 他马上呢就会内存溢出了,大家可以看到,那并且呢他帮我们在这个目录下生成了一个当前这个进程的一个当补文件,我们可以来到这个 g m logs 啊,这里呢由我之前生成的一个,那这个就是我们刚刚 生成的这个,那接下来呢,我们就利用这个叉 f t p 将这个文件呢给它导出到我们 windows 的磁盘当中,我们再确定一下,是这个二四二三二,对吧?这个文件我们把它导过来, 我刷新一下啊, ok, 有了,对吧?那接下来呢,我们就去结合叫做 we still vm 的一个工具去载入这个 dump 文件来进行定位 om, 那点击这个文件,然后点击装入,将刚刚的这个档谱文件二四二三二给它载入进来,这里注意啊,你要选择 堆好吧,否则的话你选不到, ok, 那首先我们可以看到他在这里呢,给我们显示了当前这个档谱文件他的字节数啊,里面类的总数啊,然后实力总数是多少啊?那 我们最主要呢,可以先点击这个类选项里面。 ok, 这里大家可以看到在我们这个应用运行的过程当中所 用到的这些实力,它的一些实力数,然后占到的大小,那我们肯定找到最占内存的一个实力,对不对啊?当然你像这些 char 啊, string 啊, intake, 我们可能 无法明确的定位到,对吧,但是一看这个,哎,这个好像就是我应用程序当中用到的 后就点 us 对不对?那我们可以找到我们在业务当中用到的一些对象,然后呢双击进来啊,那么这里呢,他就给你列出来了所有的 实力数,好吧,当然我们一般情况下呢,只需要点击某一个,然后呢你展开找到这个 g c root 啊,那么 g c root 呢,就是这个三角形表示的就是垃圾回收的根节点,也就是我们的 g c root, 那么通过 g c root 呢,我们就可以 显示当前这个 g c root 它的现成的引用,然后点击进来,我们可以看到当前这个 user 它在我们的 every list 当中使用了,并且呢使用的地方是在这个 user service 点 get use 方法,并且是在十七行。 ok, 那我们就可以来到我们的应用程序啊,我们找到我们的 user service 十七行,是不是就是在这里啊?在这里呢,我们写了一个死循环, 无限的去添加 u 四对象,最终造成了我们的啊 om, 所以说通过这个档谱文件,然后结合这个 gvsovm, 我们是不是就能很快的定位到这个 om 的问题啊,对不对? ok, 那这是一种情况啊,也就是我们的系统已经挂掉了,建议大家呢,在运行的时候呢,加上这个 gm 参数,那么你就可以通过档谱文件来快速的定位, ok, 那第二种情况呢,就是我们的系统还没有挂掉, 那你要去分析要怎么办呢啊?当然你可以呢在他运行的阶段去导出一个弹谱文件,好吧,或者说呢,呃,利用阿尔萨斯这种调试工具 来进行调试,那么阿尔萨斯这个工具呢?我在这里,呃,先不讲了,好吧,同学们如果有兴趣呢,呃,可以给老师点一波赞,如果赞达到了一千个呢?徐老师后续给大家更新一个怎么通过阿尔萨斯来进行一系列的故障的一些个呃,调试,好吧, 那我们在就是系统还没有挂掉的时候,我们可以导出一个档谱文件,当然有的同学会说啊,老师你在系统运行的阶段去导出档谱文件,会造成我们的一次 g c, 然后呢会造成 stop the word, 也就是所有的线程呢都会中断,但是你要知道,如果你不导出这个当谱文件的话,你要付出成倍的时间来去定位,就比方说来再给大家演示一下, ok, 来,我们继续去运行刚刚的那个应用程序叫干架,那么接下来呢,我们就先不让他挂掉了,好吧。 啊,我们要回到上一层,然后呢去运行这个 job, 干加 g m 干 demo, okay 啊,稍等一下啊,我忘记让他在后台运行了。 ok 啊,那接下来如果说我们不导出这个档谱文件,那你只能 怎么样呢?你只能通过,比如说通过这个命令禁麦法干黑 history, 然后呢, life 输入你当前这个进程的 it, 他让我,我找一下,我刚刚清了屏,对吧?我们可以通过 gps 来找到当前的这个抓进程,那这个就是我刚刚运行的这个抓进程,那我们通过 gmap 干 histo, 然后呢?呃, life, 也就是你当前存活的对象,输入你的进程 id, 二四二八六,回车。 稍等一下啊,比较多,那我们可以看到啊,他就会把你最占内存的这些呃对象给你显示出来,其实就 就是我们刚刚利用这个 g visa vm 的这个面板,其实这里通过这个工具操作出来的这种可视化的界面呢,其实他也是使用的这些命令,知道吧?那你用这个命令的话,你要定位,你只能 说我看到好像当前这个 user 比较多,对不对?那你就没有办法像我们刚刚那样啊,能够快速的去定位他的这个 gc router, 然后他的这个线程引用了, 所以呢,你要付出更加成倍的时间去定位这个问题, ok? 或者说呢,你使用像这种阿尔萨斯的这种故障的啊调试工具, ok, 好吧,所以说 为了更加快速的去定位 om 呢,我们还是建议大家呢,去使用这个命令。 ok, 来,我们打上这个击 map 干 dump, 然后 format, 我直接复制一下这个说实话我也记不住这些东西,谁会去记呢?对不对? ok, 然后这里呢,我们改一下,改成我们当前的这个进程 id 是多少啊?刚刚打印二四二八六,对吧?二四二八六,回车, 那么他打印到的是在我当前,好吧,我们依然把它打印到 gvm logs 里面的徐数, 然后点这个后缀回车,我们来看一下, 已经导出了啊,然后呢,我们一样的,我就不继续给大家去做调试了,好吧,一样的,利用我刚刚的这种思路,利用这个叉 f t b 呢,把它拿到我们的 windows 环境,然后结合这个微收 wem 去进行定位就可以了。 ok, 那这是第二种,我们可以通过这个命令呢来在线的去导出 double 文件,虽然它会造成我们这个 g c 的 stop word, 但是呢,为了更加快速定位 o m, 我觉得是值得的。 ok, 当然我不可能说我一上来就直接对我正在运行的这个应用直接就导出当补文件,对吧?我们得有理有据,就比如说我接收到了平房负 g c 或者说 c p u 漏的标高的一些告警,那么这个时候我才来 到我的服务器呢,去导出这个档口文件,然后呢进行调试啊,那么这就是我们如何快速定位 om 的一个思路啊,大家可以也就是说在你抓二程序运行的时候呢,去设置这个命令,好吧,去导出档口文件, 然后如果你的系统还没有挂呢,你可以就是运行的过程当中呢,直接来进行导出,然后呢去结合我们的 g vsovm 来进行调优,找到跟你业务有关的一些对象, 然后呢找到它相应的这个 gc rot, 然后点击右键查看县城站,那么就可以呢来快速的定位对应的这个业务代码了。 ok, 好,那么这个问题呢就给大家讲到这里,那我在这里呢也是给大家准备了一份这个快速定位 om 的我课上的一个思路的文档,那么同学们需要的话可以来加我领取,好吧?
内存溢出的定义,简称录内存溢出 out of memory, 是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存,此时程序就运行不了,系统会提示内存溢出, 有时候会自动关闭软件,重启电脑或者软件后,释放掉一部分内存,又可以正常运行该软件。而由系统配置数据流、用户代码等原因而导致的内存溢出错误, 即使用户重新执行任务依然无法避免。接下来我们要解决如何定位内存溢出问题。定位内存溢出的步骤第一步,定位 cpu 最高的服务进程先找到 cpu 占用比较高的进程 top c, 进去后按 shift 加 p 键, 一般异常的进程 cpu 的占用会很高,记录下这进程的可以查看指定进程 cpu 情况。第二步,查看指定进程 cpu 情况 top cpp 命令查看此进程占用 cpu 最高的县城,记录下县城的 ped, 也可以将相关信息保存下来。 top hpp 楼 cpu 原因 cpu text t 到此我们就找到的最占用 cpu 的进程以及相关线程。第三步,分析日志和代码 如果已经知道是哪个程序导致了内存溢出,那么我们就得学会分析日志,一般在 lt memory 的上方我们都会有各种日志的输出来标志,现在这个时间点,我们的程序执行了什么操作,导致了我们的这个内存溢出? 分析到这里就轮到看代码了。第四步,检查的内容方向第一步,查看数据库相关内容,例如查询的数据量是不是超过程序之前的设定,例如数据库连接有没有正常释放?第二步, 集合对象使用后有没有正常释放?第三步,代码中有没有死循环或者地规函数?内存溢出的解决方案, 第一,可以直接加内存。第二,检查错误日志。第三,查看 out of memory 错误前是否有其他异常或错误。第四,对代码进行走查和分析,找出可能发生内存溢出的位置。 第五,使用内存查看工具动态查看内存使用情况。关于内存溢出,你有什么好的解决方案吗?欢迎大家评论区留言。
jvm 的 out of memory error 的异常都有哪些?如何解决这些问题?哈喽,大家好,我是架构师奶爸 jvm。 java 虚拟机中的 out of memory error 内存溢出异常通常是由于应用程序试图在 jvm 中分配的内存超过了其可用内存限制而引起的。以下是一些常见的 out of memory error 异常。 一 java learn out of memory error java hips space 表示 jvm 的堆内存不足,为什么会溢出呢?要么是代码有问题, 要么是访问量太多,并且每个访问的时间太长或者数据太多导致数据释放不掉。可以通过增加 j v m 的堆内存大小来解决这个问题。二、 java learn out of memory error prom gen space 表示 k v m 的永久带 prom 键内存不足。永久带在扎瓦八及之前的版本中存在,但在扎瓦八及之后的版本中已被原空间 matispace 取代。如果遇到此异常,可以通过增加永久带的内存大小来解决。 三 java learn out of memory error metaspace 表示 j v m 的原空间内存不足,可以通过增加原空间的内存大小来解决这个问题。 四、 java learn out of memory error requestator a size excess vm limit 表示请求的数组大小超过了 jvm 的限制, 这可能是由于应用程序尝试创建非常大的数组而导致的。可以通过优化代码或使用更合适的数据结构来解决这个问题。五、 java learn out of memory error gc overhead limit exceeded 表示垃圾回收的开销超过了 jvm 限制。这种情况通常是系统处于一个主频的 gc 状态,并且应用程序中的垃圾回收时间过长导致的。 可以通过增加 j v m 的堆内存大小或优化应用程序中的内存使用来避免这种情况。六、 java learn out of memory error unable to create new native friend 表示无法创建新的本地县城, 这可能是由于县城池中的县城数量过多或 j v m 中的县城限制导致的。可以通过减少县城池的大小或增加 j v m 的县城限制来解决这个问题。要解决这些异常,您可以尝试以下方法,一、增加 j v m 的堆内存大小。使用 x m x 选项增加 j v m 的最大堆内存大小。例如,使用 java x m x 五幺二 m my app 将堆内存大小设置为五百一十二 m b。 二、增加永久带货源空间的内存大小。对于 java 八及之前的版本,可以使用 x x next process 选项增加永久带的最大内存大小。对于 java 八级之后的版本,可以使用 x x meta space size 和 x x max meta space size 选项增加原空间的初始和最大内存大小。三、优化代码或使用更合适的数据结构 检查代码中是否存在可能导致大量内存使用的错误或不良实践,并尝试使用更合适的数据结构来减少内存使用。四、增加 jvm 的垃圾回收限制 使用 x x max g c p osmeles 选项增加 j v m 的垃圾回收最大暂停时间,这可以允许垃圾回收器更频繁的运行,从而减少长时间运行导致 out of memory error 的可能性。五、减少现成池的大小或增加 j v m 的现成限制 检查应用程序中的线程池配置,并尝试减少线程池的大小或增加 j v m 的线程限制,以避免无法创建新线程导致的 out of memory error。 想学习更多 java 编程知识,请关注我架构师奶爸,共同筑基成为 java 架构师。
玩 apec 的时候,有时候会遇到这种提示,可能有些朋友觉得是自己的机器问题,其实是运行环境的问题,例如小黑和加速器,他就会引起这个问题。还有一些其他的软件也会引起这种冲突,排查一下系统环境,当时运行的软件一般都能解决掉。
哈喽,大家好,我是爱读野马的大嘟嘟。那今天呢,给大家讲一个嘉华程序员经常会遇到的错误, out of memory error, 大家有遇到过的同学可以在弹幕里面打个一, 那么当项目出现这个错误的时候,我们的项目他还能正常的去处理请求吗?啊,这个得辩证的按不同的角度来看待。首先我们来看一段代码, 这段代码很简单,有两个请求, test 和 hello, hello 请求它每一次呢都需要去消耗一百兆的内存,而 hello 请求它并不需要消耗太多的内存。 这个时候我来设置一下我们的 j v m 参数,大家可以看一下,我这样设置就表示 j v m 它最多只会用两百兆的内存。好,那么设置完之后,我来启动我的项目,我第一次访问 test, 它是会消耗一百兆内存 的,所以说它是能够消耗到的。那么假如我第二次再来访问 test 的时候,那么其实就没有一百兆内存可以用到 j v m 里面,对吧?所以这个时候呢,应该就会报错。那么我们来访问第一次访问 test, 它这里没有问题啊,那么第二次再来访问 test 的呢?哎,就抛了 out of memory 的错误。 好,那么注意,当第二次访问 test 的时候,它就是因为 g v m 里面没有可用的一百兆内存了,所以说这个 test 请求它是没办法执行的,所以说跑了这个错误。但第二次 test, 它并没有去占用内存了, 说这个时候我来访问 hello 的话,他其实应该是有剩余的请求是可以用的。呃,内存是可以用的,所以说我这里来访问 hello 其实是可以正常访问的,所以按站在我们单纯的 java 角度来看的话呢,呃,如果说你项目里面出现的 out of memory, 它并不表示所有的请求都不能执行成功,它只不过是表示有一部分请求,你如果说需要消耗的内存啊,我这边没办法提供的话,那么对于那些请求就就会持续的抛这个错误, 那么对于某些星球,你并不需要消耗太多内存,那么它还是能够正常的去执行的好。所以说当我们看到错这个错误的时候,我们脑海里面一定要知道,可能 jbm 里面还剩一部分内存,但是剩下的这部分内存呢,可能是比较少的了,所以说要注意这个点好,那么但是有同学可能在项目中心也遇到过, 嗯,就是好像一旦出现 out of memory error, 他的整个项目就挂掉了,也就说这个进程他直接就停掉了,那是为什么呢?啊?这是因为在我们的 minicus 里面有一个机制叫做 out of memory kinder 啊, 就是也是跟内存有关的,他会去监控操作系统中内存占用过高的进程,操作系统一旦发现他自己的内存不够用了啊,那么就会把占用内存最高的进程把它给 care 掉 啊。所以说当我们一个 java 进程,如果说你所占用的内存,你占的操作系统内存的非常大的一个比重,那么呢操作系统当他自己的内存发现不够用了,那么他就会把你给 care 掉。 那接下来呢,我就来给大家演示一下这个 k 的机制,我提前已经把我的刚刚这个项目的价报已经上传到了我的云服务器, 然后我这边就直接来启动他啊,注意这里呢,因为我机器的内存是五百一十二兆,就是我这里直接让我的加瓦进程直接去占用五百兆,然后我把它启动起来,启动起来之后啊,我们来 来看一下,看另外一个窗口,注意这个时候这边的 spring 部的项目其实是在正常运行的,对吧?然后我来直接访问一下当前的,呃,我们前面所说的那个 test, local host, local host, 八零八零 test 啊,第一次访问啊,它是正常执行的,这里打印了一个 sex, 那么再看第二次访问 啊,你看这边的进程,我并没有做任何的操作,他直接就被 care 掉了啊,其实就是因为,其实你两次访问之后,最终你加瓦进程可能占用了内存 太高了,那么超系统发现呢,内存不够用呢,他就把你价位竞争直接给 q 掉了,所以这就是我们刚刚说的这个机制啊,就是 king 的机制,所以大家要注意,所以呢,从这一点啊,我们应该要能够看得出来,就是 当我们自己在呃设置 j v m 参数的时候,就不能设置的太大,不然很有可能就会被操作系统给 care 掉, 好吧,所以今天呢就分享这个错误,分享到这里看大家。呃,如果还有什么问题的可以在评论区跟我讨论一下,那么今天就讲到这里,也希望能够得到大家的一见三连,谢谢大家。
大家好,今天呢要给大家说的,我们不是报显存的问题,我们是报内存,我们在内存不足的情况下,我们可以用虚拟内存,可以省去我们在内存不足的情况下省去一些费用,那什么情况下才会报内存呢?就是在我们 高清修复,还有最下面的,当我们使用一些呃放大高清放大的脚本, s d 放大这一类的,还比如说 infinite room 这种插件啊,我们去用放大算法,去用 tire 拼接的方法去给它放大这些图片的时候,都要使用到内存,那么当内存不足时, 那就会停止运作,那么如何添加虚拟内存呢?我们点击你的电脑,点击属性,然后来到这个页面,然后点击高级系统设置,弹出系统属性之后呢,点击设置来到高级,这里面点击下面这个更改虚拟内存的,这 更改电脑里呢,一般 c 盘系统上会给我们默认一点点虚拟内存,但是你要想删除 c 盘的这个虚拟内存的话,你点击这个无分页文件,点击一下设置就可以了, 那么我是将地盘呢给它设置为一百个 g 的虚拟内存,需要在自定义大小这里面你去给它设置,你要设置多少就填多少,那么它单位上呢,是以 m b 来算的,是以兆来算的。设置好之后呢,点击设置,点击确定,那么你的虚拟内存就已经设置好了, 那么最好是重启一下你的电脑,让我们的虚拟内存生效,我们可以在终端输入这段命令,点击回车,可以看到现在我们虚拟内存的使用量是多少,而你现在物理内存的使用量是多, 当你再次输入命令时,他会再次刷新,那这个命令呢,我会放到下面的评论区,这里面我们主要看他当前的使用量是多少, 还有一个最大使用量是多少,那么之后呢,你就可以不用再考虑内存不足的情况了,除非 你要拼接放大的高清图片呢,过于大上万或者五六千这种超大的图片才会出现内存的不足,那么他也会对我们显卡不足的这种情况呢有一些帮助。在显卡不足的情况下呢,我们的显卡数值 显卡使用量会达到顶峰,达会顶满,但是我们没有报内存的话,那么我们的显存在百分之百使用率的情况下,那么他会以非常慢的速度去给你啊生成的图片完成。好了,那么今天的这个分享呢就到这里,如果大家觉得有用请点击关注加三连,那么谢谢大家。
如果你玩 stable diffusion 显卡不足,电脑卡顿不熟不了的话,那今天我推一个工具啊,在线的体验 ai 绘图,堪称操作简化版的 stable diffusion。 大家好,我是蒙克,很多同学呢,到现在还没有用上 stable diffusion, 当然啊, ai 绘画现在的新同学啊,也是比较多的, stable diffusion 的操作以及汉化的确是非常的不方便。那今天呢,我要推的这个海意啊,你可以理解成操作人性化版的 stable diffusion, 免费入门且好学。首先呢,我们来演示一下,打开海意 ai 链接呢,是这个选择 ai 绘画选择这里的海意二点零下面这个模型呢, 就是相当于是你在 stable dq 中呢选择一个底膜风格呢,你可以理解成劳尔全是选择题。在这里啊, 输入提示词以后呢,你就可以生成各种各样的图片了,是不是非常的轻松,连模型啊都不用自己下了。如果呢,你不是小白,想要使用 ctrl net, 那你看左边这里有个条件生图, 这里呢,就可以选择各种各样的 control net 的模型了。左边这些呢,是各种插件都不需要自己安装。各类操作呢,其实都比 stable 的优势啊,简便很多,要求不高的话呢,你就可以直接使用这个,而且啊,最最牛的是 他还可以在线炼单有没有?我们回到主页之后呢,打开 ai 模型,创建一个数据集,添加这些数据集的图片, 直接点击右上角的开始训练就可以了。参数呢,可以在高级设置里啊进行设置,如果你足够懒的话,那么什么参数你都不用调。这个插件目前啊可以免费使用。讲到这里呢,好想用的同学啊。就可以直接充了 好了,我是蒙克,一个一天玩二十三小时 ai 的穿越者。关注我, ai 时代不掉队。