当前位置: 首页 > news >正文

JVM常见面试题

说说JVM对象创建与内存分配的流程

首先经过类加载检查,将需要的类加载到jvm内存中,即经过加载、验证、准备、解析、初始化

其次分配内存(指针碰撞/空闲列表)

再初始化(给成员变量赋初始值null/0)

之后设置对象头

最后执行init()方法

内存分配采用的方法

指针碰撞

内存空间分配规则时,有一个已使用和未使用的临界指针,分配内存时只需要往后空出几个空间。这就是指针碰撞

空闲列表

内存分配不规则时,已被使用的内存和空闲的内存交错在一起,虚拟机就会维护一个列表,记录可用的内存空间。当对象创建时,就可以找到空闲的内存进行分配

在并发对象创建时的处理流程

CAS乐观锁+失败重试

多个线程一起抢内存空间,只能有一个线程抢到,其他线程再去抢其他的内存空间

本地线程分配缓冲

每个线程都在堆中事先规划一块独立的线程专属空间,线程在new对象时,只向自己的内存空间存放,也就是jvm需要开启TLAB

对象内存分配流程

线程new对象时,会先进行对象逃逸分析,非对象逃逸的话优先存放去栈上,如果栈上分配不下的话,还是会在堆上分配

在堆上分配优先存放Eden区(TLAB本地线程缓冲),但如果对象太大会分配到老年代

长期存活的对象直接进入老年代(默认经过15次FullGC)。

ThreadLocal为什么会导致内存泄漏?如何解决的?

ThreadLocal的作用,可以在这个线程中被线程的方法调用,类似缓存。每个线程中都有一个ThreadLocalMap属性,key值为ThreadLocal,value为缓存值。key值是弱引用,value值是强引用,GC时会清除弱引用,但是强引用value不会被清除。

在线程池中,一旦给ThreadLocalMap赋值了,没有手动remove(),那么就会造成内存泄漏的问题。

解决方法:

手动执行remove()方法。

避免线程池中使用ThreadLocalMap。

平时要做好监控和预防。

什么是三色标记?

是CMS的底层算法逻辑。

分为黑色、灰色、白色

黑色:表示对象和它引用的对象都已被检查且都是可达的

灰色:表示对象已被检查是可达的,但是它引用的对象未被检查

白色:表示对象和它引用的对象都未被检查。白色对象可能是垃圾,直到它被证明为可达的

说说你们生产环境遇到的哪些JVM内存问题?是怎么解决的?

内存泄漏,线程池中使用了ThreadLocalMap,未手动remove()

频繁fullGC问题,一个高并发的系统,由于老年代内存不足,导致频繁Full GC,解决方法:

1、调整堆内存配置,增加老年代内存空间

2、优化对象的生命周期,减少不必要的对象创建

内存碎片的问题:批处理调度,频繁创建和释放大对象,导致内存碎片化

解决方法:

1、调整内存配置,增加连续内存块的大小

2、减少大对象的频繁分配和释放

3、使用G1垃圾回收器(底层采用复制算法)

4、CMS垃圾回收器(底层采用标记清除算法),可修改参数更改为标记整理算法,减少内存碎片的产生

相关文章:

  • 足底筋膜炎的症状
  • 2024ICPC网络赛第一场C. Permutation Counting 4(线性代数)
  • 【程序员必读】近年来编程提效工具大合集。小白必看!
  • 9月26日day16
  • 望繁信科技CTO李进峰受邀在上海外国语大学开展流程挖掘专题讲座
  • Linux 如何发送带有 RequestBody 的 POST 请求
  • 影刀RPA实战:java结合影刀同步采购订单数据
  • IDEA2020运行项目时不从配置的maven仓库找jar包,从C盘默认路径下找jar包
  • C++日期类实现
  • 【Python语言初识(五)】
  • linux修改命令别名的方式
  • 前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
  • ——快速排序
  • SpringCloud Gateway 打印请求响应日志、跨域全局配置
  • 2024!再见前端!
  • __proto__ 和 prototype的关系
  • “大数据应用场景”之隔壁老王(连载四)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【391天】每日项目总结系列128(2018.03.03)
  • Bytom交易说明(账户管理模式)
  • centos安装java运行环境jdk+tomcat
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mysql常用命令汇总
  • Shadow DOM 内部构造及如何构建独立组件
  • text-decoration与color属性
  • 关于Java中分层中遇到的一些问题
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 思维导图—你不知道的JavaScript中卷
  • 【云吞铺子】性能抖动剖析(二)
  • 2017年360最后一道编程题
  • ​2020 年大前端技术趋势解读
  • ​比特币大跌的 2 个原因
  • !!Dom4j 学习笔记
  • !$boo在php中什么意思,php前戏
  • #Linux(Source Insight安装及工程建立)
  • #LLM入门|Prompt#3.3_存储_Memory
  • ${ }的特别功能
  • (03)光刻——半导体电路的绘制
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (每日一问)基础知识:堆与栈的区别
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十六)一篇文章学会Java的常用API
  • (算法)Travel Information Center
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • .ai域名是什么后缀?
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 解决重复提交问题