===========================================================================
JVM在进行GC时,并非每次都对上面三个内存(新生代,老年代,方法区)区域
一起回收的,大部分时候回收的都是指新生代。
针对HotSpot VM的实现,它里面的GC按照回收区域分为两大种类型:一种是部
分收集(Partial GC),一种是整堆收集(Full GC)
1.部分收集:不是完整收集整个Java堆的垃圾收集,其中又分为:
(1)新生代收集(Minor GC / Young GC):只是新生代(Eden / S0,S1)的
垃圾收集
(2)老年代收集(Major GC / Old GC):只是老年代的垃圾收集
· 目前,只有CMS GC 会有单独回收老年代的行为
· 注意,很多时候Major GC 会和Full GC 混淆使用,需要具体分辨是
老年代回收还是整堆回收
(3)混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集
· 目前,只有G1 GC会有这种行为
2.整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集
年轻代GC(Minor GC)触发机制
1.当年轻代空间不足时,就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC(每次Minor GC 会清理年轻代的内存)
2.因为,Java对象大都具备朝生夕死的特性,所以MinorGC非常频繁,一般回收速度也比较快,这一定义既清晰又易于理解
3.Minor GC会引发STW,暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行**
Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程
序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现
象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这
些现象多半是由于gc引起,因此jvm调优大部分是让GC的次数少一些。
老年代GC(Major GC)触发机制
1.指发生在老年代的GC,对象从老年代消失时,我们说“MajorGC”或“Full GC”发生了
2.出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行MajorGC的策略选择过程)
·也就是在老年代空间不足时,会先尝试触发MinorGC,如果之后空间还不足,则触发Major GC
3.Major GC的速度一般会比Minor GC慢十倍以上,STW的时间更长
4.如果Major GC后,内存还不足,就报OOM了
5.Major GC的速度一般会比Minor GC慢十倍以上
触发Full GC执行的情况有如下五种
1.调用System.gc()时,系统建议执行Full GC,但是不必然执行
2.老年代空间不足
3.方法区空间不足
4.通过Minor GC后进入老年代的平均大小大于老年代的可用内存
5.由Eden区、survivorspace0(form space)区向survivor space1(to space)区复制时,对象大小大于ToSpace可用内存,则把该对象转存到老年代,并且老年代的可用内存小于该对象大小
说明:Full GC是开发或调优中尽量要避免的,这样暂停时间会短一些
===========================================================================
总结: 如果对象在Eden出生并经过第一次MinorGC后仍能存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并将对象年龄设为1,对象在Survivor区中每熬过一次MinorGC,年龄就会增加1岁,当它的年龄增加到一定程度(默认15岁,其实每个JVM,每个GC都有所不同)时,就会晋升到老年代中
针对不同年龄段的对象分配原则如下所示:
1.优先分配到Eden
2.大对象直接分配到老年代(尽量避免程序中出现过多的大对象)
3.长期存活的对象分配到老年代
**4.动态对象年龄判断
(如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄)**
四、TLAB(Thread Local Allocation Buffer)
=========================================================================================================
(1)从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含了在Eden空间内
(2)多线程同事分配内存时,使用TLAB可以避免一系列的非线程安全问题,同事还能够提示内存分配的吞吐量,因此我们可以将这种内存分配方式称为快速分配策略
(3)据我所知所有OpenJDK衍生出来的JVM都提供了TLAB的设计
2.为什么有TLAB(Thread Local Allocation Buffer)
(1)堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据
(2)由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的
(3)为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度
再说明:
(1)经过不是所有的对象实例都能够再TLAB中成功分配内存,但JVM确实是将TLAB作为内存分配的首选
(2)在程序中,开发人员可以通过选项“-XX:UseTLAB”设置是否开启TLAB空间
(3)默认情况下,TLAB空间的内存非常小,仅占有整个Eden空间的1%,当然我们可以通过选项“-XX:TLABWasteTargetPercent”设置TLAB空间所占有Eden空间的百分比大小
(4)一旦对象在TLAB空间分配内存失败下,JVM就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后:
总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。
面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。
img2.imgtp.com/2024/03/13/H4lCoPEF.jpg" />
最后:
总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。
面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。