3.Java面试题—JVM基础、【内存管理】、【垃圾回收】 & 垃圾收集器、JVM 调优

一、JVM 基础【重要】

一篇文章掌握整个JVM,JVM超详细解析!!!

什么是 JVM (Java虚拟机)?

  • JVM (Java虚拟机) 是运行 Java 字节码虚拟机
  • JVM 针对 不同系统特定实现 (WindowsLinux 等),目的是 同样的代码不同平台 能运行出 相同的结果

为什么说 Java 语言 “编译与解释并存”?

Java 语言 要经过 编译解释 两个步骤:

  1. 编译:通过 编译器代码 一次性 编译字节码
  2. 解释:通过 解释器代码 一句一句地 解释机器代码

Java类 加载过程?

点击查看:JVM 类加载机制与加载过程

Java类 加载过程如下:

  • 加载:将硬盘上 Java字节码文件 (Class文件) 转为 内存 中的 Class对象
  • 验证:检查载入的 class文件数据正确性
  • 准备 (重要):为 静态变量 分配内存,并设置为 初始值 (0、false、null 等)。
  • 解析:将 常量池 内的 符号引用 转换为 直接引用
  • 初始化:为 类变量 (静态变量) 赋值,执行 静态代码块
    在这里插入图片描述

二、内存管理【重要】

说⼀下 JVM 的内存区域 | 运行时数据区是怎样的?

Java内存区域详解 (重点)

  • 线程共享。存放 对象实例数组字符串常量池 (也称 GC堆)。
  • 虚拟机栈线程私有。存储方法的内 局部变量操作数 等。
  • 本地方法栈线程私有。同 虚拟机栈,只不过是 本地方法
    本地方法:就是 Java 调用的 非Java代码 实现的接口】
  • 程序计数器线程私有。用于记录 线程 当前的 执行的位置
  • 元空间线程共享元空间 就在 中,存储 类的元数据静态方法静态属性
    在这里插入图片描述

[了解] 什么是 Java内存模型?

  • JMM 规定了 多线程环境 下所有的 变量 都存储在 主内存 中,从而保证变量的 可见性有序性。【validate

[了解] 栈帧 是什么?栈帧 有什么作用?

栈帧组成单位栈帧是一种数据结构,它封装了以下信息:

  • 局部变量表:存储 局部变量
  • 动态链接:存储 当前方法 调用的 目标方法链接
  • 方法返回地址:存储 目标方法执行完毕 后的 返回地址

程序计数器 有什么作用?

点击查看

程序计数器 主要有下面两个作用:

  • 程序计数器 用于记录 线程 当前的 执行的位置
  • 解释器 通过改变 程序计数器依次读取指令

什么是 内存溢出?有哪些情况会导致 内存溢出?

内存溢出 (OOM) 是指 系统 没有足够的 内存空间 可以 分配,从而出现的一种 异常


导致内存溢出的情况:

  • 创建大量对象
  • 内存泄漏

什么是 内存泄漏?内存泄漏 有什么影响?

Java内存泄露系列–内存泄露的原因及解决方案(大全)

内存泄露堆内存 中的 对象 不再使用时,垃圾回收器无法回收 该对象,导致 内存泄露


内存泄漏 的影响:

  • 长时间连续运行时 性能严重下降
  • 出现 OOM 导致 应用崩溃

有哪些情况会导致 内存泄漏?

Java中内存泄露原因总结

  • 静态集合类静态集合类(如ArrayList、HashMap) 生命周期与程序一致,程序结束之前 不会被释放,会引起 内存泄漏
  • 连接(IO/数据)未释放:如果连接不被显性的关闭,会引起 内存泄漏

三、Java8 垃圾回收【重要】

1、垃圾回收流程

JVM–内存模型/垃圾回收流程

Java 堆的内存分区了解吗?

Java堆内存内存模型

  • 堆内存 主要划分为 年轻代老年代元空间 三个区域。
  • 年轻代 存放 存活时间短 的对象,每次 垃圾回收 后存活的对象,将会逐步存放到 老年代
  • 年轻代 又可以分为两个区域:EdenSurvivorSurvivor 分为 From区To区
    在这里插入图片描述

JDK8 垃圾回收 的 流程?

JVM–内存模型/垃圾回收流程

  • 1、创建一个新对象 时,JVM会将 新对象 保存在 年轻代Eden区,如果 Eden区空间 不足,则会执行 Minor GC (年轻代GC)
  • 2、Minor GC 会将 Eden区From区 中的 存活对象 复制到 To区,然后清空 Eden区From区
  • 3、如果 To区空间 不足,会继续进行 Minor GC,部分 年轻代对象 会逐渐放入 老年代,直到 To区空间 充足。
  • 4、如果此时 老年代内存 不足,则将执行 Full GC
  • 5、Full GC 后,如果 老年代内存 仍然不足,则会抛出 内存溢出 (OOM) 错误,程序中断运行

什么是 Stop The World?

垃圾回收 时,会涉及 对象的移动。为了保证 对象引用 的正确性,必须 暂停所有线程,这样的停顿被称为 Stop The World (STW)


(了解) 对象有哪几种引用?

Java引用类型(强引用、软引用、弱引用、虚引用)的区别

  • 强引用:代码中普遍存在的 赋值引用强引用 关联的对象,不会被 垃圾收集器 回收。
  • 软引用软引用 关联的对象,MinorGC 第二次遇到 软引用对象 才会进行回收。(第一次只进行 标记)
  • 弱引用弱引用 关联的对象,会被 垃圾收集器 回收。
  • 虚引用:最弱的⼀种 引用关系,不会影响对象的 生存时间

2、垃圾收集器

垃圾收集算法 有哪些?

  • 复制算法
    年轻代 垃圾回收 一般都是基于 复制算法
  • 标记-清除算法
  • 标记-整理算法

垃圾收集器都有哪些?

  • Minor GC 垃圾收集器Parallel (并行)Serial (串行)
  • Full GC 垃圾收集器CMSG1

CMS 和 G1 区别?

CMS收集器和G1收集器的区别

  • CMS 基于 标记-清除算法G1 基于 标记-整理算法 (整体)复制算法 (局部)
  • CMS 并发清除阶段 会导致 内存碎片比过多G1 主要解决了 内存碎片过多 的问题。
  • Java8 默认使用 CMS 回收 老年代
    在这里插入图片描述

说一下 CMS 垃圾收集器 的工作过程?

CMS 垃圾收集器 使用 标记-清除算法,收集过程分为四步:

  1. 初始标记:标记 GC Roots直达的对象。需要 STW
  2. 并发标记:从 GC Roots直达的对象 开始 遍历,找出要 回收的对象
  3. 重新标记:标记 并发标记阶段 产生的对象。需要 STW
  4. 并发清除:清理掉 标记阶段 标记的对象。

说一下 G1 垃圾收集器 的工作过程?

G1 收集器 使用了 复制算法标记-整理算法,收集过程分为四步:

  1. 初始标记:标记 GC Roots直达的对象。需要 STW
  2. 并发标记:从 GC Roots直达的对象 开始 遍历,找出要 回收的对象
  3. 重新标记:标记 并发标记阶段 产生的对象。需要 STW
  4. 筛选回收:选择多个 Region 构成 回收集,把 回收集 中 的 存活对象 复制到 空的 Region 中,再清理掉 旧 Region 的全部空间。需要 STW

哪些 对象 可以作为 GC Root?

  • 静态属性 引用的对象
  • 实例属性 引用的对象
  • 中引用的对象

判断 垃圾对象 的方法有哪些?

  • 引用计数法缺点:当两个垃圾对象 互相引用 时,不会 被判定为 垃圾对象
  • 可达性分析

四、JVM 调优

JVM通常设置哪些参数来调优?

  • -Xms初始堆大小
  • -Xmx最大堆大小:一般将 XmsXmx 设为一样的值,避免重新分配内存。
  • -Xmn:设置 年轻代空间大小

堆内存、新生代、老年代 一般设置为多大内存?

Java — 堆内存、新生代、老年代 一般设置为多大内存?

  • 堆内存:通常将 最大堆内存大小 设置为可用 物理内存的 1/22/3
  • 新生代:通常设置为整个 堆内存1/3
  • 老年代:通常设置为整个 堆内存2/3

频繁 Minor GC 怎么办?

  • 频繁 Minor GC 的原因新生代 空间较小,Eden 区To区 很快会被填满。
  • 解决方法:可以通过 增大新生代空间 -Xmn 来降低 Minor GC 的频率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

页川叶川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值