粉丝3.7万获赞17.4万

forge 呢,应该不会有人不知道吧,对吧,属于 j v m 里面比较基础的概念了。简单来讲呢,就是老年代的内存满了要全部清掉,清的过程呢, a j v m 没法工作了啊,所有的请求呢,没法响应了,也就是发生了我们常说的骚不得 word, 那么对于一些互联网公司或者是一些响应要求比较高的场景呢, stop the word 啊,肯定是不行的啊,所以很多所谓的调优啊,说到底呢,就是想办法减少复合机制的次数和执行的时间, 引起复合 gc 的原因呢,像老年代满了会复合 gc 对吧,这种呢,应该是复合 gc 占比比较多的原因了。我们都知道 jvm 呢,产生的对象呢,首先会放到这个连接带里面,什么一定区啊,服装区啊,突区啊,对吧,那么这些区满了呢,会触发 八年前代的 g c 啊,经过几十轮啊,几百轮的这个央 g c 啊,一些老的对象呢,如果还没有被清掉啊,就会挪到老年代。 还有一些比较大的对象啊,如果超过了设置的预值啊,也会直接进入老年代,这个时候如果老年代满了啊,那么就会直接复合 gc, 所以很多时候年轻代的这个空间呢,不能过大啊,如果大了,很多的对象往老年代挪的时候呢,就容易溢出啊,然后复合 gc, 一般呢是建议年轻代与老年代的大小比例呢,在一比二,还有呢,是在内存里啊,不能放置很大的对象啊,大对象呢,会导致你的集合对象过大,会直接放到老年代里面, 也容易触发 forgc。 那么在代码里呢啊,也是可以通过 system 点儿 gc 来执行 forgc 的, 初中呢,是可以通过啊,比如说认为的干预啊,对吧,在一些访问量比较小呀啊,比如说像夜里面啊,通过任务计划的方式呢,来执行 fogc, 但是呢,这个貌似不太可靠啊,很多情况下呢,并不是立即执行的,这个方法呢,只是建议啊,借 vm 进行 fogc, 并不是一定执行, 但是总的来讲呢,还是会增加符合 g c 的频率,所以很多时候呢,还是建议啊,不要用这种方法来符合 g c, 让虚拟机自己去管理它的内存。 还有一种呢是空间分配担保失败,这个呢也会触发 forgc。 我们正常情况下呢,在年轻代分配,当达到一定的这个回收次数之后呢,会挪到老年代去, 但是呢,楼的过程也要确保老年代够用,所以呢,在样 g c 之前啊,会做一下啊,空间担保 担保,老年代呢,能够存得下领金贷的这些对象,担保失败呢,就会认为老年再也放不了了啊,就会进行复活 gc。 那么关于大家比较关心的条约的问题的话呢, 我是建议啊,如果各项参数设置合理啊,系统没有超时的日日出现啊, gc 频率不高啊, gc 耗时不高啊,那么就没有必要进行 gc 的优化。 如果 gc 时间超过了一到三秒或者频繁的 gc, 那么就需要关注了。好了,本期的视频呢,就是现在,如果您对本期的内容呢,有任何疑问,欢迎大家在评论区给我留言,谢谢大家。


关于 gm 中一次完整的 gc 流程,怎么样的对象是如何晋升到老年代的?这个问题在面试过程中的频率非常高,今天正好有空给大家分享一下这个问题的回答思路。如果需要文字版本和完整的大厂面试手册,可以在评论区的置顶中去领取。 关于这个问题,我们可以先描述加号对于内存的划分,再解释 manel g c, 复尔 g c, 最后再描述他们之间的转化流程。 nice 以下是我的回答思路。加尔堆内存是由新生代和老年代组成,其中啊,新生代又包括一等区和 cyv 区。一个新的对象首先会分配在一等区, 如果是大对象会直接进入到老年代。当一等区空间满了以后,基本会触发一次 manen 七 c 用来回收一等区的内存。一等区存活下来,对象会转移到 c yy 区。如果对象 在一等区出生并经过一次 man g c 以后仍然存活,那么这个时候这个对象的 g c 年龄会设置成一。每熬过一次 man g c, 该对象的 g c 年龄都会进行累加。 如果超过默认的 gc 次数十五次,这个对象就会转移到老年代。当老年代满了以后无法容纳更多对象的时候,就会触发富尔 gc。 富尔 gc 呢,会清理整个堆内存,包括年轻代,老年代。 需要注意的是,在进行副耳 gc 之前啊,通常会先进行一次样 gc, 你尽可能的清理掉一等区和十万个区的垃圾对象,以减少副耳 gc 的压力和耗时。 在样 gc 以后,存活对象将会被复制到什么样区或者 out 区,而一的区呢?会被完全清空,等待下一次的对象分配。好的,今天的分享就到这里,感谢大家的关注和点赞,如果你还有更多好的问题可以在评论区给我留言,我们下次再见,拜拜!

这个时候我们的解决方案是怎么样的呢?我们应该大喊一声,运为加内存,我的天呐,这么神奇吗?欢迎来到新一期的小欧说编程,今天来给大家分享一下内存溢出和内存泄露。 简单的讲,内存溢出就是内存不够的,比如我们现在 j v m 里面有十兆的内存,程序员 a 进行查询操作的时候,查出了二十兆的数据,但由于我们的 j v m 里面只有十兆的内存,这个时候就会发生内存溢出到 o m 的报错。 然后我们再来讲一下什么是内存泄露。内存泄露简单的说就是由于程序员 b 写的一些不规范的代码,导致咱们在调用一个方法的时候,或者调用一段程序的时候,在 jvm 里面占用的内存无法释放,这个就是内存泄露。 就比如现在的某一个程序,他在执行的时候需要占用两兆的内存,由于他在执行完之后,这两兆的内存无法被回收,所以 jvm 里面有两兆的空间,有两兆的内存 空间被占用。如果多次调用这样相同的程序的话, abm 里面的空间就会不断的被占用,最后会导致内存不够用,从而触发内存溢出。通常是什么情况下会造成内存的溢出,什么情况下会造成内存的泄露呢? 内存溢出比较常见的情况就是运维在给 jvm 分配的内存比较小,这个时候我们的解决方案是怎么样的呢?我们应该大喊一声,运维加内存。还有一种比较常见的情况,就是咱们在查询列表的时候,有些同事没有进行分页,把整个数据库表的数据都给 low 了出来,这个时候也会报内存溢出,比如你这个数据量非常大的话,你一下子全部查出来丢到内存里面, 这个时候就会爆 om。 那什么情况下会发生内存泄露呢?内存泄露的情况也比较多,比较常见的就是不断的使用 swind local, 然后没有把 swind local 调用铃木方法,也会造成内存的泄露。当然还有很多滥用静态变量的方式也会造成内存的泄露。 你们还知道有哪些情况会造成内存的溢出和内存的泄露吗?欢迎在评论区留言讨论,这个就是本期的分享视频,我们下期再见! nice!

我真的没有开叉 gbt 的,我就是八个文背的时候而已。嗯,面试官,你好你好。哎,你好啊,你要不讲讲看这位 m 里面 gc 的分配担保原则吧。 嗯,分配担保原则。呃,这是个啥原则啊?这不是今年应届生的必考题目吗?又叫做内分配担保机制啊,你知道吗?嗯, 我,我想起来了我想起来了。呃, jbm 分配担保原则就是指在进行垃圾回收时,能够确保新生代的这些对象,然后能够进入老年代的一个原则。 具体就是说发生 minor g c 之前 j v m, 然后会先检查老年代中剩余空间是否大于新生代所有对象的总空间,如果大于等于,那么就是可以进行 行 mono g c, 如果小于,那么 j b m 就会进行一次负 g c。 嗯,今年这个好多公司都在问这个题啊,我也是说你应该不太可能。不会啊,不过你答的这么顺啊,那我们问点稍微难的吧,就在实际工作中啊,我们是如何评判线上的这个 g c 啊?是否发生了问题呢? 嗯,这个就是靠两个标准吗?一个是那个颜值,也就是最大停顿时间,具体的说就是在垃圾收集过程中,一次 stw 的最长时间越短越好,还有就是吞吐量, 嗯,所谓的吞吐量就是 mutator 有效花费时的时间占系统总运行时间的百分比。举个例子就是,比如系统运行了一百分钟嘛,然后 jc 消耗那个 一分钟,则系统吞吐量为百分之九十九。嗯,你懂得还挺多的啊,那要不讲讲看如何判定这个 mat space 这个区发生 oom 呢? 嗯,我知道的就是当阶 v m 在启动后或者某个时间点开始,如果 matter space 的仪式用大小 在持续增长,然后同时每次 gc 也无法释放并且调大那个 matter space 的空间也无法彻底得到解决的时候,一般都是应该是 matter space 发生了 o m。 嗯你脸上能懂这么多,我怎么怀疑你这个是在开了叉的 gpt 再回答啊啊我真的没有开叉的 gpt 的,我就是八个文背的时候而已。那你要不来公司面试看看吧啊 ok ok 好的好的。
