一、JVM 基础【重要】
一篇文章掌握整个JVM,JVM超详细解析!!!
什么是 JVM (Java虚拟机)?
JVM (Java虚拟机)
是运行 Java 字节码 的 虚拟机。- JVM 针对 不同系统 有 特定实现 (Windows、Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果。
为什么说 Java 语言 “编译与解释并存”?
Java 语言 要经过 编译 和 解释 两个步骤:
编译
:通过 编译器 将 代码一次性
编译 成字节码
。解释
:通过 解释器 将 代码一句一句地
解释 成机器代码
。
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堆内存 的 内存模型:
- 堆内存 主要划分为
年轻代
、老年代
、元空间
三个区域。- 年轻代 存放 存活时间短 的对象,每次 垃圾回收 后存活的对象,将会逐步存放到 老年代。
- 年轻代 又可以分为两个区域:
Eden
、Survivor
,Survivor 分为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 垃圾收集器:
CMS
、G1
CMS 和 G1 区别?
CMS收集器和G1收集器的区别
CMS
基于标记-清除算法
。G1
基于标记-整理算法
(整体) 和复制算法
(局部)。CMS
并发清除阶段 会导致 内存碎片比过多。G1
主要解决了内存碎片过多
的问题。- Java8 默认使用 CMS 回收 老年代。
说一下 CMS 垃圾收集器 的工作过程?
CMS 垃圾收集器 使用
标记-清除算法
,收集过程分为四步:
初始标记
:标记 GC Roots 能 直达的对象。需要STW
。并发标记
:从 GC Roots 能 直达的对象 开始 遍历,找出要 回收的对象。重新标记
:标记 并发标记阶段 产生的对象。需要STW
。并发清除
:清理掉 标记阶段 标记的对象。
说一下 G1 垃圾收集器 的工作过程?
G1 收集器 使用了
复制算法
和标记-整理算法
,收集过程分为四步:文章来源:https://www.toymoban.com/news/detail-617152.html
初始标记
:标记 GC Roots 能 直达的对象。需要STW
。并发标记
:从 GC Roots 能 直达的对象 开始 遍历,找出要 回收的对象。重新标记
:标记 并发标记阶段 产生的对象。需要STW
。筛选回收
:选择多个 Region 构成 回收集,把 回收集 中 的 存活对象 复制到 空的 Region 中,再清理掉 旧 Region 的全部空间。需要STW
。
哪些 对象 可以作为 GC Root?
静态属性
引用的对象实例属性
引用的对象栈
中引用的对象
判断 垃圾对象 的方法有哪些?
引用计数法
:缺点:当两个垃圾对象 互相引用 时,不会 被判定为 垃圾对象。可达性分析
四、JVM 调优
JVM通常设置哪些参数来调优?
-Xms
:初始堆大小。-Xmx
:最大堆大小:一般将 Xms 和 Xmx 设为一样的值,避免重新分配内存。-Xmn
:设置 年轻代空间大小。
堆内存、新生代、老年代 一般设置为多大内存?
Java — 堆内存、新生代、老年代 一般设置为多大内存?文章来源地址https://www.toymoban.com/news/detail-617152.html
堆内存
:通常将 最大堆内存大小 设置为可用 物理内存的1/2
到2/3
。新生代
:通常设置为整个 堆内存 的1/3
。老年代
:通常设置为整个 堆内存 的2/3
。
频繁 Minor GC 怎么办?
频繁 Minor GC 的原因
:新生代 空间较小,Eden 区 和 To区 很快会被填满。解决方法
:可以通过 增大新生代空间-Xmn
来降低 Minor GC 的频率。
到了这里,关于3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!