返回

剖析JVM经典面试题,揭秘对象分配与内存管理机制

后端

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. 使用性能分析工具

  • 可以使用性能分析工具来分析程序的内存使用情况
  • 可以帮助我们找到内存泄漏和其他性能问题