返回
剖析JVM经典面试题,揭秘对象分配与内存管理机制
后端
2024-02-09 13:44:16
JVM经典面试题总结(下)
一、对象分配
1. 对象在内存中是如何进行分配的?
1.1 对象优先在Eden分配
对象优先在『伊甸园』分配,当『伊甸园』没有足够的空间时,触发 'MinorGC'(小范围的GC)
情况一:伊甸园的内存空间充足
- 对象直接分配在Eden空间
情况二:伊甸园的内存空间不足
- 启动'MinorGC',将Eden空间中仍然存活的对象复制到Survivor0空间
- 将Eden空间中死亡的对象回收
1.2 对象晋升到Survivor空间
情况一:对象在Survivor0空间中仍然存活
- 将对象复制到Survivor1空间
情况二:对象在Survivor1空间中仍然存活
- 对象晋升到Old空间
1.3 对象在Old空间中分配
- 对象直接分配在Old空间
2. 对象在内存中是如何进行回收的?
2.1 MinorGC
- 当Eden空间不足时触发
- 回收Eden空间和Survivor0空间中死亡的对象
- 将Eden空间和Survivor0空间中仍然存活的对象复制到Survivor1空间
2.2 MajorGC
- 当Old空间不足时触发
- 回收Old空间中死亡的对象
- 将Old空间中仍然存活的对象复制到Survivor0空间
2.3 FullGC
- 当Eden空间和Old空间都不足时触发
- 回收Eden空间、Survivor空间和Old空间中死亡的对象
- 将Eden空间、Survivor空间和Old空间中仍然存活的对象复制到Survivor0空间
二、内存管理
1. JVM内存结构
JVM内存分为堆空间、栈空间、方法区和本地方法栈
- 堆空间 :存储对象实例和数组
- 栈空间 :存储方法的局部变量和操作数栈
- 方法区 :存储类的静态变量、常量和方法代码
- 本地方法栈 :存储native方法的栈帧
2. 垃圾回收算法
JVM采用分代式垃圾回收算法,将堆空间划分为Eden空间、Survivor空间和Old空间
- Eden空间 :存储新创建的对象
- Survivor空间 :存储从Eden空间晋升过来的对象
- Old空间 :存储长期存活的对象
3. 垃圾回收过程
3.1 标记-清除算法
- 标记出堆空间中需要回收的对象
- 清除标记出的对象
3.2 标记-整理算法
- 标记出堆空间中需要回收的对象
- 将存活的对象整理到一起
- 清除标记出的对象
3.3 增量式垃圾回收算法
- 将垃圾回收过程分成多个小的阶段
- 每个阶段回收一部分对象
- 这样可以减少垃圾回收对程序运行的影响
三、优化JVM性能
1. 调优JVM参数
- -Xms :设置JVM初始堆空间大小
- -Xmx :设置JVM最大堆空间大小
- -Xss :设置JVM栈空间大小
- -XX:+UseConcMarkSweepGC :使用并发标记-清除算法
- -XX:+UseG1GC :使用G1垃圾回收算法
2. 使用对象池
- 对象池是一种预分配对象的缓存机制
- 可以减少对象创建和销毁的开销
3. 避免内存泄漏
- 内存泄漏是指对象不再被引用,但仍然占据着内存空间
- 可以通过使用弱引用和软引用来避免内存泄漏
4. 使用性能分析工具
- 可以使用性能分析工具来分析程序的内存使用情况
- 可以帮助我们找到内存泄漏和其他性能问题