Day329&330&331&332,2024大厂Java开发面试总结+解答

image-20210715223854447

image-20210715224322727

image-20210715224817034

image-20210715224833860

image-20210715225325903

2、OOM举例

image-20210715215308544

image-20210715225949472

image-20210715230102372

三、新生代&老年代


1、堆空间结构

image-20210716204138230

对象被创建会先放着伊甸区,若没被GC,那后来会进入幸存者区,然后还没有被GC就再到老年区

2、堆空间设置比例大小

image-20210716211046711

-XX:NewRatio=size #设置新生代老年代比例【新生代:老年代】

-XX:SurvivorRatio=size #设置新生代与幸存者区比例【伊甸区:幸存者1区:幸存者2区】

-Xmn size #设置新生代空间大小 (一般不设置)

image-20210716211956521

image-20210716212330056

  • 对象存放流程

先放入Eden区,若还存活;就放入Survivor区,若还存活;就放入Tenured老年代

image-20210716204207350

四、图解对象分配过程


1、概述

-XX:MaxTenuringThreshold=size #设置进入老年区的阈值

image-20210716204231982

image-20210716204238361

  • YGC/Minor GC触发的条件

当伊甸园区满的时候,且还要进行加入对象时触发

  • 当幸存者区满的时候,不会触发YGC/Minor GC

  • 当幸存者区满了后,可能会被直接转移至老年代

2、对象分配的一般过程图示

  • 步骤1:↓

当伊甸园区满的时候,再造对象时,会触发SWT(StopWord停止用户线程),启动YGC/Minor GC(GC线程),去回收伊甸园区里的内存空间,通过可达性分析算法,进行垃圾回收;如果还有被占用/使用的对象,那就会被转移到幸存者区;

并为每一个转移还在使用的对象分配一个年龄计数器,并将每个年龄计数器赋值为1;

这时,S0为FROM区,S1为TO区;(谁空谁是TO)

此时伊甸园区里面就没有数据了,完全情况,垃圾被回收,再使用的被转移至幸存者区S0中,此时S1为空;

image-20210716212704910

  • 步骤2:↓

那么接下来创建的对象,就会再被放入伊甸园区;

再放放放放…,此时伊甸园区又满了;

再次触发,YGC/Minor GC垃圾回收,情况如上;

但是此时还在被使用的对象,就会被转移至S1中;此时S0存之前转移的对象,S0存此时转移来的对象;被设置转移对象的年龄计数器为1,;

但是!!!此时YGC/Minor GC垃圾回收,会对之前S1中存储对象进行判断,他们是否还再被使用;

如果还被使用就转移到S1区,然后给他们的年龄计数器+1;如果不使用,就被垃圾回收;

此时!!!伊甸园区和S0里面已经被GC清空了!此时S0就变成了幸存者TO区。

这时,S0是幸存者TO区,S1是幸存者FROM区;(谁空谁是TO)

之后就一直重复如上的过程!!!!!!

image-20210716213507524

  • 步骤3:↓

重复如上的过程。。。。

如果当幸存者区里面的的对象还有被占用,且他的年龄计数器大于15,他就会被Promotion(晋升);

将其还被占用的对象,且年龄计数器大于15的对象,转移至老年代;

此时就不再考虑年龄计数器了,年龄计数器只用于: 幸存者区===>老年区的指标

这里的年龄计数器的15,为阈值;默认为15;

进入老年代后,再被回收的可能性就会很小了。。。

image-20210716214220333

3、总结

image-20210716215838455

  • 谁空谁是TO

  • 频繁收集新生代,较少收集养老带,几乎不动永久带


4、流程图

image-20210716204318276

  • 代码示例

image-20210716204324621

  • 伊甸园区/幸存者S0/幸存者S1/老年代区的内存使用情况图

image-20210716220735509

5、常用的调优工具

image-20210716204345882

五、Minr GC、Major GC与Full GC


1、概述

image-20210717202152558

2、最简单的分代式GC策略触发条件

image-20210717202502353

image-20210717200330014


image-20210717202957503


image-20210717203109519

image-20210717204409662

六、堆空间分代思想


最主要的原因就是针对对应活跃度的数据做出GC回收,而不是对全部的对象数据进行GC遍历

又浪费性能,又浪费时间,提升效率

image-20210717200412700

image-20210717205539945

七、内存分配策略


1、一般情况

image-20210717200437780

2、对象提升原则(内存分配策略)

image-20210717211230406

同年龄对象内存和大于s区的一半,大于等于该年龄对象全部进入老年代

八、为对象分配内存:TLAB


为每一个线程分配缓冲区,大致意思就是把Eden分成小格小格的,每个线程先用自己的小格子来分配对象,避免线程安全问题

1、目的

image-20210717213721977

2、定义

在伊甸园区为每一个线程分配一份独立的缓存区

image-20210717214838237

3、图示

image-20210717214044215

4、说明

默认开启了TLAB空间,JVM会将TLAB区域作为对象内存分配的首选,如果对象被分配到了TLAB中就不用考虑线程安全问题,而当TLAB满了的时候,对象就只能放在外面,此时就需要加锁了来保证线程数据安全,与数据不被覆盖

image-20210717215453866

  • 命令行代码

-XX:UseTLAB #查看是否开启TLAB空间

-XX:TLABWasteTargetParent #设置TLAB空间比例

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

合、并发编程、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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值