当前位置: 首页 > news >正文

JVM【面试题】2024最新

文章目录

  • 什么是JVM
  • Jvm的组成
  • 说一下jvm的内存区域
  • 堆和栈的区别
  • 对象创建的过程
  • 对象销毁的过程
  • 内存泄漏和内存溢出
  • 对象的引用方式
  • Java堆内存分区
  • 新生代的垃圾回收算法
  • 对象什么时候去往老生代
  • 垃圾搜集器的选择
  • 双亲委派模型

什么是JVM

jvm就是java虚拟机,他是java跨平台的基石,并且不仅仅是java可以使用jvm虚拟机,只要是在jvm虚拟机上面跑的程序都可以被jvm编译成2进制文件

Jvm的组成

类加载机器:负责从文件系统、网络或其他来源加载 Class 文件,将 Class 文件中的二进制数据读入到内存当中。

内存:JVM 在执行 Java 程序时,需要在内存中分配空间来处理各种数据,这些内存区域主要包括方法区、堆、栈、程序计数器和本地方法栈。

执行引擎:执行引擎是 JVM 的心脏,负责执行字节码。它包括一个虚拟处理器,还包括即时编译器(JIT Compiler)和垃圾回收器(Garbage Collector)。

说一下jvm的内存区域

jvm内存区域也叫jvm运行的数据区,按照Java的规范可以分成:

  • 程序计数器:当前线程所执行的字节码行号指示器
  • 虚拟机栈:当线程执行一个方法时,会创建一个对应的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,然后栈帧会被压入栈中。当方法执行完毕后,栈帧会从栈中移除。
  • 本地方法栈:在本地方法栈中,主要存放了 native 方法的局部变量、动态链接和方法出口等信息。当一个 Java 程序调用一个 native 方法时,JVM 会切换到本地方法栈来执行这个方法。
  • 堆:堆(heap)是 JVM 中最大的一块内存区域,被所有线程共享,在 JVM 启动时创建,主要用来存储对象的。并且Java 中“几乎”所有的对象都会在堆中分配,堆也是垃圾收集器管理的目标区域,因此一些资料中也会把 Java 堆称作“GC 堆”(Garbage Collected Heap)。
  • 本地方法区:不经常问

堆和栈的区别

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

对象创建的过程

当我们使用 new 关键字创建一个对象的时候,JVM 首先会检查 new 指令的参数是否能在常量池中定位到一个类的符号引用,然后检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就先执行相应的类加载过程。

如果已经加载,JVM 会为新生对象分配内存,内存分配完成之后,JVM 将分配到的内存空间初始化为零值(成员变量,数值类型是 0,布尔类型是 false,对象类型是 null),接下来设置对象头,对象头里包含了对象是哪个类的实例、对象的哈希码、对象的 GC 分代年龄等信息。

最后,JVM 会执行构造方法(),将成员变量赋值为预期的值,这样一个对象就创建完成了。

对象销毁的过程

对象创建完成后,就可以通过引用来访问对象的方法和属性,当对象不再被任何引用指向时,对象就会变成垃圾。

垃圾收集器会通过可达性分析算法判断对象是否存活,如果对象不可达,就会被回收。

垃圾收集器会通过标记清除、标记复制、标记整理等算法来回收内存,将对象占用的内存空间释放出来。

内存泄漏和内存溢出

内存泄漏:在使用过内存的某一块区域后,没有对那个区域进行内存释放,随着时间的推移,内存越来越小,这样就发生了内存泄漏

内存溢出:程序在请求内存时没有足够大的内存满足要求,就发生内存溢出。

对象的引用方式

强、软、弱、虚引用

Java堆内存分区

  1. 新生代(Young Generation):
    • Eden区(Eden Space):这是对象最初被分配的地方。大多数对象在被创建时都会被分配到Eden区。
    • 幸存者区(Survivor Space):在新生代中有两个幸存者区,通常称为Survivor Space或者S0和S1。这些区域用来存储从Eden区复制过来的存活对象。
  2. 老年代(Old Generation):
    • 老年代(Tenured or Old Generation):这是存放长期存活的对象的区域。当对象在新生代经过多次垃圾回收后仍然存活,它们会被移到老年代。
  3. 永久代/元空间(PermGen/Metaspace):
    • 永久代(Permanent Generation):在旧版的JVM中使用,用来存放JVM加载的类信息、常量池、静态变量等。
    • 元空间(Metaspace):在较新的JVM中取代了永久代。元空间使用本地内存来存放类的元数据,因此不再有永久代的大小限制,而是受本地内存的限制。

新生代的垃圾回收算法

  1. 复制算法(Copying Algorithm):
    • 新生代通常使用复制算法来实现垃圾回收。这种算法将堆内存划分为两个相等的区域(通常称为Eden空间和两个Survivor空间),其中Eden空间用于分配新对象。当Eden空间填满时,触发Minor GC(新生代GC)。
    • Minor GC 发生时,存活的对象会被复制到其中一个Survivor空间中,而不是被标记并清除。
  2. 标记-复制算法(Mark-Compact Algorithm):
    • 有时候,复制算法会与标记-复制算法结合使用。这种算法在执行Minor GC时,首先使用标记过程标记所有存活对象,然后将它们复制到另一个区域,最后清理原始区域中的所有对象。

对象什么时候去往老生代

当对象在新生代经过多次垃圾回收后仍然存活,它们会被移到老年代。

垃圾回收机制

垃圾回收机制(GC)就是对内存堆里面死亡或者不经常使用的对象进行回收和清除

JVM在进行GC之前会通过可达性算法判断是否为垃圾

finalize()方法

在进行GC之前JVM会对所有的方法进行可达性算法,如果不可达就进行标记,下一次就进行回收(这就是标记-回收算法),而finalize就是,如果该对象在被JVM执行可达性算法后已经被标记了,但是他引用了finalize()方法,那么他就不会被回收。(GC相当于问斩,而finalize相当于刀下留人)

垃圾搜集器的选择

  • Serial :如果应用程序有一个很小的内存空间(大约 100 MB)亦或它在没有停顿时间要求的单线程处理器上运行。
  • Parallel:如果优先考虑应用程序的峰值性能,并且没有时间要求要求,或者可以接受 1 秒或更长的停顿时间。
  • CMS/G1:如果响应时间比吞吐量优先级高,或者垃圾收集暂停必须保持在大约 1 秒以内。
  • ZGC:如果响应时间是高优先级的,或者堆空间比较大。

双亲委派模型

当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,依次递归,直到最顶层的类加载器,如果父类加载器无法完成加载请求,子类加载器才会尝试自己去加载。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++ | 设计模式】工厂方法模式的详解与实现
  • Kompose工具:转换Compose项目为K8S项目
  • 深度强化学习算法(三)(附带MATLAB程序)
  • priority_queue模拟
  • 【动态规划】区间dp
  • 通过SynchronousQueue方式实现线程间数据传递
  • 算法笔记|Day37动态规划X
  • Websocket笔记
  • Tarjan的脱机最小公共祖先算法详解
  • Linux 数据结构 内核链表 栈
  • 联影一面面经
  • 探索VB与ASP.NET的融合艺术:Web开发的高效实践
  • Centos7目前能下载到的位置
  • HSE软件组件有哪些?如何实现HSE与主机的通信(同步/异步)?如何使用HSE提供的安全服务?
  • mybatis if标签判断字符串是否相等
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Asm.js的简单介绍
  • Git 使用集
  • Java到底能干嘛?
  • Koa2 之文件上传下载
  • Redis的resp协议
  • supervisor 永不挂掉的进程 安装以及使用
  • ucore操作系统实验笔记 - 重新理解中断
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端知识点整理(待续)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 带你开发类似Pokemon Go的AR游戏
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Java NIO(一)FileChannel
  • $.ajax,axios,fetch三种ajax请求的区别
  • (02)Unity使用在线AI大模型(调用Python)
  • (7)摄像机和云台
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (待修改)PyG安装步骤
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十八)Flink CEP 详解
  • (一)Dubbo快速入门、介绍、使用
  • (一)Neo4j下载安装以及初次使用
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .apk文件,IIS不支持下载解决
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .htaccess配置常用技巧
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net framework 4.8 开发windows系统服务
  • .net SqlSugarHelper
  • .Net 代码性能 - (1)
  • .net 托管代码与非托管代码
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表