jvm学习笔记(GC,分代思想,TLAB)

(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堆和方法区的垃圾收集

1.Minor GC


年轻代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的次数少一些。

2.Major 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慢十倍以上

3.Full 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.什么是TLAB


(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空间中分配内存

五、测试堆空间常用的jvm参数

==================================================================================

-XX:+PrintFlagsInitial:查看所有的参数的默认初始值

-XX:+PrintFlagsFinal:查看所有的参数的默认最终值(可能会存在修改,不再是初始值)

-Xms:初始堆空间内存(默认为物理内存的1/64)

-Xmx:最大堆空间内存(默认为物理内存的1/4)

-Xmn:设置新生代的大小(初始值及最大值)

-XX:NewRatio:设置新生代与老年代在堆结构的占比
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里免费领取前端学习资料

你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)**

[外链图片转存中…(img-TWqBhprA-1713544691209)]

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里免费领取前端学习资料

前端学习书籍导图-1

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值