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

这篇具有很好参考价值的文章主要介绍了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 等)。
  • 解析:将 常量池 内的 符号引用 转换为 直接引用
  • 初始化:为 类变量 (静态变量) 赋值,执行 静态代码块
    3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优,Java后端面试题 | CABR实习,jvm,java,开发语言

二、内存管理【重要】

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

Java内存区域详解 (重点)

  • 线程共享。存放 对象实例数组字符串常量池 (也称 GC堆)。
  • 虚拟机栈线程私有。存储方法的内 局部变量操作数 等。
  • 本地方法栈线程私有。同 虚拟机栈,只不过是 本地方法
    本地方法:就是 Java 调用的 非Java代码 实现的接口】
  • 程序计数器线程私有。用于记录 线程 当前的 执行的位置
  • 元空间线程共享元空间 就在 中,存储 类的元数据静态方法静态属性
    3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优,Java后端面试题 | CABR实习,jvm,java,开发语言

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

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

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

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

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

程序计数器 有什么作用?

点击查看

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

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

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

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


导致内存溢出的情况:

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

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

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

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


内存泄漏 的影响:

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

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

Java中内存泄露原因总结

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

三、Java8 垃圾回收【重要】

1、垃圾回收流程

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

Java 堆的内存分区了解吗?

Java堆内存内存模型

  • 堆内存 主要划分为 年轻代老年代元空间 三个区域。
  • 年轻代 存放 存活时间短 的对象,每次 垃圾回收 后存活的对象,将会逐步存放到 老年代
  • 年轻代 又可以分为两个区域:EdenSurvivorSurvivor 分为 From区To区
    3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优,Java后端面试题 | CABR实习,jvm,java,开发语言

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 回收 老年代
    3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优,Java后端面试题 | CABR实习,jvm,java,开发语言

说一下 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 — 堆内存、新生代、老年代 一般设置为多大内存?文章来源地址https://www.toymoban.com/news/detail-617152.html

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

频繁 Minor GC 怎么办?

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

到了这里,关于3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM基础知识(内存区域划分,类加载,GC垃圾回收)

    目录 内存区域划分 JVM中的栈 JVM中的堆 程序计数器 方法区(元数据区) 给一段代码,某个变量在哪个区域上? 类加载 类加载时机 双亲委派模型 GC 垃圾回收机制 GC 实际工作过程 1.找到垃圾/判定垃圾 1.可达性分析(Java中的做法) 2.引用计数 2.清理垃圾 1.标记清除 2.复制算法 3.标记整

    2024年02月07日
    浏览(63)
  • java八股文面试[JVM]——垃圾回收

    参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收 面试题: JVM内存模型 以及分区,需要详细到每个区放什么 堆里面的分区:Eden,survival from to,老年代,各自的特点。 GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方 针

    2024年02月11日
    浏览(43)
  • JVM——垃圾回收器G1+垃圾回收调优

    定义: 取代了CMS垃圾回收器。和CMS一样时并发的。  适用场景: 物理上分区,逻辑上分代。   相关JVM参数: -XX:+UseG1GC -XX:G1HeapRegionSize=size -XX:MaxGCPauseMillis=time  三个回收阶段,第一个是新生代回收,第二个是新生代+CM,第三个是混合回收。 当老年代内存超过阈值,会在新生代垃

    2024年02月12日
    浏览(44)
  • java八股文面试[JVM]——垃圾回收器

    jvm结构总结   常见的垃圾回收器有哪些?     CMS(Concurrent Mark Sweep) 整堆收集器 : G1 由于整个过程中 耗时最长 的 并发标记 和 并发清除 过程中,收集器线程都可以与用户线程一起工作,所以 总体上来说 ,CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收

    2024年02月11日
    浏览(44)
  • java面经03-虚拟机篇-jvm内存结构&垃圾回收、内存溢出&类加载、引用&悲观锁&HashTable、引用&finalize

    要求 掌握 JVM 内存结构划分 尤其要知道方法区、永久代、元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码 执行 java 命令 创建 JVM,调用类加载子系统加载 class,将类的信息存入 方法区 创建 main 线程,使用的内存区域是 JVM 虚拟机栈 ,

    2024年02月09日
    浏览(56)
  • 2.6. Java内存管理与垃圾回收

    2.6.1. Java内存模型 在Java中,内存被划分为以下几个区域: 堆(Heap):存储对象实例和数组,是垃圾回收的主要区域。 栈(Stack):存储局部变量和方法调用。每个线程有自己的栈。 方法区(Method Area):存储类信息,如类的结构、方法、字段等。 本地方法栈(Native Method

    2024年02月07日
    浏览(39)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(88)
  • jvm垃圾回收及内存模型

    1、了解垃圾回收之前,必须先了解内存模型 jdk1.8后,元空间是 方法区的具体实现 (方法区是规范,之前叫永久代)   1)运行时常量池  就是字节码生成的Class对象包含上述的常量池       2、垃圾回收区域    a、 首先要标记垃圾,找出垃圾      b、Java垃圾回收(一)_java 垃

    2024年02月08日
    浏览(54)
  • JVM之内存与垃圾回收篇2

    PC Register是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError的区域。 为什么要有PC寄存器? 因为CPU会在不同的线程之间来回切换,切换回来之后,需要知道接着从哪里开始执行。 JVM字节码解释器需要通过改变PC寄存器中的值来明确下一条应该执行什么样的字节码指令。

    2024年02月17日
    浏览(49)
  • JVM学习 GC垃圾回收机制 (堆内存结构、GC分类、四大垃圾回收算法)

    🤖 作者简介: 努力的clz ,一个努力编程的菜鸟 🐣🐤🐥   👀 文章专栏: 《JVM 学习笔记》 ,本专栏会专门记录博主在学习 JVM 中学习的知识点,以及遇到的问题。   🙉 文章详情: 本篇博客是学习 【狂神说Java】JVM快速入门篇 的学习笔记,关于 GC垃圾回收机制 (堆内存结

    2023年04月19日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包