JVM面试问题总结

一:什么是JVM

(1)定义:

JVM指的是Java虚拟机。JVM本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。

(2)作用:

为了支持Java中一次编写,到处运行的跨平台特性。

(3)JVM功能:

(4)JVM的组成:

二:字节码文件的组成

文件的头几个字节(文件头)称为魔数,用来校验文件类型;

Java版本号=主版本号-44。

三:运行时数据区

(1)程序计数器

(2)栈

(3)堆

垃圾回收器以及垃圾回收算法详情见下文。

(4)方法区

方法区在不同的JDK版本位置有所不同,在JDK7及以前,方法区位于对内存的永久代中;在JDK8及之后位于元空间中,脱离了堆,位于操作系统管理的直接内存中。如图所示:

使用元空间替换永久代的原因?

四:哪些区域会出现内存溢出

在JVM中,只有程序计数器不会出现内存溢出,因为每个线程的程序计数器只保存一个固定长度的内存地址。

五:类的生命周期

类的生命周期分为:加载---连接---初始化---使用---卸载。其中连接又可分为 验证,准备,解析

(1)加载

(2)连接之验证

(3)连接之准备

(4)连接之解析

(5)初始化

(6)卸载

六:什么是双亲委派机制

1、当一个类加载器去加载一个类的时候,会先自下向上查看这个类是否被加载过,如果被加载过,就直接返回,如果没被加载过,就自上向下加载;

2、自定义类加载器的父类是应用程序类加载器,应用程序类加载器的父类是扩展类加载器,扩展类加载器的父类是启动类加载器;

3、双亲委派机制的好处是:避免恶意代码替换JDK中的核心类库,保证类加载的安全性;避免一个类被重复加载。

七:如何打破双亲委派机制

八:如何判断堆上的对象没有被引用

(1)引用计数法

(2)可达性分析法

九:JVM中的引用类型

十:有哪些常见的垃圾回收算法

(1)标记-清除算法

(2)复制算法

(3)标记-整理算法

(4)分代GC

分代GC的优点:

十一:有哪些常用的垃圾回收器

十二:ThreadLocal中为什么要使用弱引用

当创建ThreadLocal对象时,会有一条强引用链指向ThreadLocal对象,当给对象赋值时,实际是以当前ThreadLocal为key值为value存入ThreadLocalMap中,当对象使用完毕后,强引用关系解除,由于Entry对象的key是弱引用指向ThreadLocal,所以在垃圾回收时会回收掉ThreadLocal对象,但此时还存在key为null值为value的Entry对象(这也是ThreadLocal会造成内存泄露的原因),所以在ThreadLocal使用结束后,还必须手动调用remove方法进行删除。

相关推荐
洛卡卡了8 小时前
我们在用 AI 写代码时,为什么建议要好好维护 AGENTS.md 呢?
面试·agent·claude
PBitW8 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
自由路飞14 小时前
RAG 混合检索深挖:BM25 和向量分数为什么不能直接相加?
面试
未秃头的程序猿14 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
阳光是sunny1 天前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
蝎子莱莱爱打怪1 天前
DSpark 讲透:DeepSeek 不换模型,硬把 V4 提速 85%,是怎么做到的?
人工智能·面试·程序员
程序员七平2 天前
面试官:你说你Vibe Coding手拿把掐,那 Claude Code 用户级、项目级、本地级配置怎么隔离?
面试
葫芦和十三2 天前
图解 MongoDB 17|大集合与工作集:数据超过内存怎么办
后端·mongodb·面试
葫芦和十三2 天前
图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工
后端·mongodb·面试
葫芦和十三2 天前
图解 MongoDB 15|journal 与持久化:写入怎么不丢,崩溃怎么恢复
后端·mongodb·面试