JVM【面试题】2024最新

文章目录

什么是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:如果响应时间是高优先级的,或者堆空间比较大。

双亲委派模型

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

相关推荐
宇瞳月6 分钟前
HTML语言的贪心算法
开发语言·后端·golang
专注API从业者9 分钟前
【京东API开发指南】三步获取商品详情页实时数据:SKU、价格、销量全解析
java·前端·javascript
QQ_77813297414 分钟前
突破时空边界:Java实时流处理中窗口操作与时间语义的深度重构
java
huohuopro22 分钟前
Maven生命周期
java·开发语言·后端·maven
嘵奇25 分钟前
Spring Boot 与 Couchbase 整合教程
java·spring boot·后端
veejaLiu28 分钟前
LeetCode 30.串联所有单词的子串
java·学习·算法·leetcode·职场和发展·刷题
小丁爱养花33 分钟前
Web 小项目: 网页版图书管理系统
java·spring·mybatis
Peter_chq35 分钟前
Django快速入门
开发语言·数据库·后端·python·django
zeijiershuai2 小时前
Java单元测试、Junit、断言、单元测试常见注解、单元测试Maven依赖范围、Maven常见问题解决方法
java·junit·单元测试·maven