一、JVM 基础【重要】
什么是 JVM (Java虚拟机)?
JVM (Java虚拟机)是运行 Java 字节码 的 虚拟机。- JVM 针对 不同系统 有 特定实现 (Windows、Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果。
为什么说 Java 语言 “编译与解释并存”?
Java 语言 要经过 编译 和 解释 两个步骤:
编译:通过 编译器 将 代码一次性编译 成字节码。解释:通过 解释器 将 代码一句一句地解释 成机器代码。
Java类 加载过程?
Java类 加载过程如下:
加载:将硬盘上 Java字节码文件 (Class文件) 转为 内存 中的 Class对象。验证:检查载入的 class文件数据 的 正确性。准备 (重要):为 静态变量 分配内存,并设置为 初始值 (0、false、null 等)。解析:将 常量池 内的 符号引用 转换为 直接引用。初始化:为 类变量 (静态变量) 赋值,执行 静态代码块。
二、内存管理【重要】
说⼀下 JVM 的内存区域 | 运行时数据区是怎样的?
堆: 线程共享。存放 对象实例、数组、字符串常量池 (也称GC堆)。虚拟机栈:线程私有。存储方法的内 局部变量、操作数 等。本地方法栈:线程私有。同虚拟机栈,只不过是 本地方法。
【本地方法:就是 Java 调用的 非Java代码 实现的接口】程序计数器:线程私有。用于记录 线程 当前的 执行的位置。元空间:线程共享。元空间 就在 堆 中,存储 类的元数据、静态方法、静态属性。
[了解] 什么是 Java内存模型?
JMM规定了 多线程环境 下所有的 变量 都存储在 主内存 中,从而保证变量的 可见性 和 有序性。【validate】
[了解] 栈帧 是什么?栈帧 有什么作用?
栈帧是栈的 组成单位。栈帧是一种数据结构,它封装了以下信息:
局部变量表:存储 局部变量。动态链接:存储 当前方法 调用的 目标方法 的 链接。方法返回地址:存储 目标方法执行完毕 后的 返回地址。
程序计数器 有什么作用?
程序计数器主要有下面两个作用:
程序计数器用于记录 线程 当前的 执行的位置。- 解释器 通过改变
程序计数器来 依次读取指令。
什么是 内存溢出?有哪些情况会导致 内存溢出?
内存溢出(OOM) 是指 系统 没有足够的 内存空间 可以 分配,从而出现的一种 异常。
导致内存溢出的情况:
创建大量对象内存泄漏
什么是 内存泄漏?内存泄漏 有什么影响?
内存泄露:堆内存 中的 对象 不再使用时,垃圾回收器 却 无法回收 该对象,导致 内存泄露。
内存泄漏 的影响:
- 长时间连续运行时 性能严重下降;
- 出现 OOM 导致 应用崩溃;
有哪些情况会导致 内存泄漏?
静态集合类:静态集合类(如ArrayList、HashMap) 生命周期与程序一致,程序结束之前 不会被释放,会引起 内存泄漏。连接(IO/数据)未释放:如果连接不被显性的关闭,会引起 内存泄漏。
三、Java8 垃圾回收【重要】
1、垃圾回收流程
Java 堆的内存分区了解吗?
Java堆内存 的 内存模型:
- 堆内存 主要划分为
年轻代、老年代、元空间三个区域。- 年轻代 存放 存活时间短 的对象,每次 垃圾回收 后存活的对象,将会逐步存放到 老年代。
- 年轻代 又可以分为两个区域:
Eden、Survivor,Survivor 分为From区、To区。
JDK8 垃圾回收 的 流程?
- 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)。
(了解) 对象有哪几种引用?
强引用:代码中普遍存在的 赋值引用。强引用 关联的对象,不会被 垃圾收集器 回收。软引用:软引用 关联的对象,MinorGC 第二次遇到 软引用对象 才会进行回收。(第一次只进行 标记)弱引用:弱引用 关联的对象,会被 垃圾收集器 回收。虚引用:最弱的⼀种 引用关系,不会影响对象的 生存时间。
2、垃圾收集器
垃圾收集算法 有哪些?
复制算法
【年轻代 垃圾回收 一般都是基于 复制算法】标记-清除算法标记-整理算法
垃圾收集器都有哪些?
- Minor GC 垃圾收集器:
Parallel(并行)、Serial(串行)- Full GC 垃圾收集器:
CMS、G1
CMS 和 G1 区别?
CMS基于标记-清除算法。G1基于标记-整理算法(整体) 和复制算法(局部)。CMS并发清除阶段 会导致 内存碎片比过多。G1主要解决了内存碎片过多的问题。- Java8 默认使用 CMS 回收 老年代。
说一下 CMS 垃圾收集器 的工作过程?
CMS 垃圾收集器 使用
标记-清除算法,收集过程分为四步:
初始标记:标记 GC Roots 能 直达的对象。需要STW。并发标记:从 GC Roots 能 直达的对象 开始 遍历,找出要 回收的对象。重新标记:标记 并发标记阶段 产生的对象。需要STW。并发清除:清理掉 标记阶段 标记的对象。
说一下 G1 垃圾收集器 的工作过程?
G1 收集器 使用了
复制算法和标记-整理算法,收集过程分为四步:
初始标记:标记 GC Roots 能 直达的对象。需要STW。并发标记:从 GC Roots 能 直达的对象 开始 遍历,找出要 回收的对象。重新标记:标记 并发标记阶段 产生的对象。需要STW。筛选回收:选择多个 Region 构成 回收集,把 回收集 中 的 存活对象 复制到 空的 Region 中,再清理掉 旧 Region 的全部空间。需要STW。
哪些 对象 可以作为 GC Root?
静态属性引用的对象实例属性引用的对象栈中引用的对象
判断 垃圾对象 的方法有哪些?
引用计数法:缺点:当两个垃圾对象 互相引用 时,不会 被判定为 垃圾对象。可达性分析
四、JVM 调优
JVM通常设置哪些参数来调优?
-Xms:初始堆大小。-Xmx:最大堆大小:一般将 Xms 和 Xmx 设为一样的值,避免重新分配内存。-Xmn:设置 年轻代空间大小。
堆内存、新生代、老年代 一般设置为多大内存?
堆内存:通常将 最大堆内存大小 设置为可用 物理内存的1/2到2/3。新生代:通常设置为整个 堆内存 的1/3。老年代:通常设置为整个 堆内存 的2/3。
频繁 Minor GC 怎么办?
频繁 Minor GC 的原因:新生代 空间较小,Eden 区 和 To区 很快会被填满。解决方法:可以通过 增大新生代空间-Xmn来降低 Minor GC 的频率。
本文详细介绍了JVM的基础知识,包括Java虚拟机的作用,Java的编译与解释过程,以及类加载机制。在内存管理部分,阐述了JVM的内存区域,如堆、虚拟机栈和本地方法栈等,并讨论了内存溢出和内存泄漏的概念及影响。接着,文章重点讨论了Java8的垃圾回收机制,包括垃圾回收流程、各种垃圾收集器(如CMS和G1)的工作原理,以及如何进行JVM调优,如设置堆内存和新生代大小以减少MinorGC的频率。




86万+

被折叠的 条评论
为什么被折叠?



