2、OOM举例
1、堆空间结构
对象被创建会先放着伊甸区
,若没被GC,那后来会进入幸存者区,然后还没有被GC就再到老年区
2、堆空间设置比例大小
-XX:NewRatio=size #设置新生代老年代比例【新生代:老年代】
-XX:SurvivorRatio=size #设置新生代与幸存者区比例【伊甸区:幸存者1区:幸存者2区】
-Xmn size #设置新生代空间大小 (一般不设置)
- 对象存放流程
先放入Eden区,若还存活;就放入Survivor区,若还存活;就放入Tenured老年代
1、概述
-XX:MaxTenuringThreshold=size #设置进入老年区的阈值
- YGC/Minor GC触发的条件:
当伊甸园区满的时候,且还要进行加入对象时触发
-
当幸存者区满的时候,不会触发YGC/Minor GC
-
当幸存者区满了后,可能会被直接转移至老年代
2、对象分配的一般过程图示
- 步骤1:↓
当伊甸园区满的时候,再造对象时,会触发SWT(StopWord停止用户线程),启动YGC/Minor GC(GC线程),去回收伊甸园区里的内存空间,通过可达性分析算法,进行垃圾回收;如果还有被占用/使用的对象,那就会被转移到幸存者区;
并为每一个转移还在使用的对象分配一个年龄计数器,并将每个年龄计数器赋值为1;
这时,S0为FROM区,S1为TO区;(谁空谁是TO)
此时伊甸园区里面就没有数据了,完全情况,垃圾被回收,再使用的被转移至幸存者区S0中,此时S1为空;
- 步骤2:↓
那么接下来创建的对象,就会再被放入伊甸园区;
再放放放放…,此时伊甸园区又满了;
再次触发,YGC/Minor GC垃圾回收,情况如上;
但是此时还在被使用的对象,就会被转移至S1中;此时S0存之前转移的对象,S0存此时转移来的对象;被设置转移对象的年龄计数器为1,;
但是!!!此时YGC/Minor GC垃圾回收,会对之前S1中存储对象进行判断,他们是否还再被使用;
如果还被使用就转移到S1区,然后给他们的年龄计数器+1;如果不使用,就被垃圾回收;
此时!!!伊甸园区和S0里面已经被GC清空了!此时S0就变成了幸存者TO区。
这时,S0是幸存者TO区,S1是幸存者FROM区;(谁空谁是TO)
之后就一直重复如上的过程!!!!!!
- 步骤3:↓
重复如上的过程。。。。
如果当幸存者区里面的的对象还有被占用,且他的年龄计数器大于15,他就会被Promotion(晋升);
将其还被占用的对象,且年龄计数器大于15的对象,转移至老年代;
此时就不再考虑年龄计数器了,年龄计数器只用于: 幸存者区===>老年区的指标
这里的年龄计数器的15,为阈值;默认为15;
进入老年代后,再被回收的可能性就会很小了。。。
3、总结
-
谁空谁是TO
-
频繁收集新生代,较少收集养老带,几乎不动永久带
4、流程图
- 代码示例
- 伊甸园区/幸存者S0/幸存者S1/老年代区的内存使用情况图
5、常用的调优工具
1、概述
2、最简单的分代式GC策略触发条件
最主要的原因就是针对对应活跃度的数据做出GC回收,而不是对全部的对象数据进行GC遍历;
又浪费性能,又浪费时间,提升效率
1、一般情况
2、对象提升原则(内存分配策略)
同年龄对象内存和大于s区的一半,大于等于该年龄对象全部进入老年代
为每一个线程分配缓冲区,大致意思就是把Eden分成小格小格的,每个线程先用自己的小格子来分配对象,避免线程安全问题
1、目的
2、定义
在伊甸园区为每一个线程分配一份独立的缓存区
3、图示
4、说明
默认开启了TLAB空间,JVM会将TLAB区域作为对象内存分配的首选
,如果对象被分配到了TLAB中就不用考虑线程安全问题,而当TLAB满了的时候,对象就只能放在外面,此时就需要加锁了来保证线程数据安全,与数据不被覆盖
- 命令行代码
-XX:UseTLAB #查看是否开启TLAB空间
-XX:TLABWasteTargetParent #设置TLAB空间比例
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
我的面试宝典:一线互联网大厂Java核心面试题库
以下是我个人的一些做法,希望可以给各位提供一些帮助:
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
还有源码相关的阅读学习
合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
[外链图片转存中…(img-4CJiCWoe-1711735468330)]
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
[外链图片转存中…(img-jbSYkaz4-1711735468330)]
还有源码相关的阅读学习
[外链图片转存中…(img-odDBcaFK-1711735468331)]