JVM面试

1.Java 运行时一个类是什么时候被加载的?

一个类在什么时候开始被加载,《Java 虚拟机规范》中并没有进行强制约束,交给了虚拟机

自己去自由实现,HotSpot 虚拟机是按需加载,在需要用到该类的时候加载这个类

2.JVM 一个类的加载过程?

一个类从加载到 jvm 内存,到从 jvm 内存卸载,它的整个生命周期会经历 7 个阶段:

(1)加载(Loading):classpath、jar 包、网络、某个磁盘位置下的类的 class 二进制字节流读进来,在内存中生成一个代表这个类的 java.lang.Class 对象放入元空间,此阶段我们程序员可以干预,我们可以自定义类加载器来实现类的加载

(2)验证(Verification):验证 Class 文件的字节流中包含的信息符合《Java 虚拟机规范》的全部约束要求,保证虚拟机的安全

(3)准备(Preparation):类变量赋默认初始值,int 为 0,long 为 0L,boolean 为 false,引用类型为 null;常量赋正式值

(4)解析(Resolution):把符号引用翻译为直接引用

(5)初始化(Initialization):当我们 new 一个类的对象,访问一个类的静态属性,修改一个类的静态属性,调用一个类的静态方法,用反射 API 对一个类进行调用,初始化当前类,其父类也会被初始化... 那么这些都会触发类的初始化

(6)使用(Using):使用这个类

(7)卸载(Unloading):

①该类所有的实例都已经被 GC,也就是 JVM 中不存在该 Class 的任何实例;

②加载该类的 ClassLoader 已经被 GC;

③该类的 java.lang.Class 对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法

其中验证、准备、解析三个阶段统称为连接(Linking)

3.一个类被初始化的过程?

(1)类的初始化阶段,Java 虚拟机才真正开始执行类中编写的 Java 程序代码;

(2)进行准备阶段时,变量已经赋过一次系统要求的初始零值,而在初始化阶段,才真正初始化类变量和其他资源

4.继承时父子类的初始化顺序是怎样的?

父类--静态变量

父类--静态初始化块

子类--静态变量

子类--静态初始化块

父类--变量

父类--初始化块

父类--构造器

子类--变量

子类--初始化块

子类--构造器

什么是内存溢出,什么是内存泄漏?如何避免

(1)什么是内存溢出?

假设我们JVM中可用的内存空间只剩下3M,但是我们要创建一个5M的对象,那么,新创建的对象就放不进去了。这个时候,我们就叫做内存溢出。

(2)内存泄漏它代表业务代码执行时,所需要占用的内存空间。假设业务创建了两个1M的对象,一起会占用2M内存。当对象使用完之后,这两个对象并没有释放,因此内存中会留下2M的内存空间一直被占用。而我们的业务代码在程序中会被反复执行,每次执行都会留下2M不被释放,反复执行多次之后,随着时间的累积,就会有大量的对象用完不被释放,导致这些对象不能得到回收而发生内存溢出,这种情况就叫做内存泄漏。

(3)如何避免?

我们在Code过程中,特别是些一些流对象比如:OutputStream,Reader,BitMap,Document,很容易忘了Close。最麻烦的是还要顺序回收,顺序错了还产生空指针,所以,在Code过程一定要注意

JMM是什么?

Java内存模型(简称JMM),是一种规范,它定义了Java虚拟机(JVM)在计算机内存(RAM)中的工作方式,即规范了Java虚拟机与计算机内存之间是如何协同工作的。它规定了一个线程如何以及何时可以看到其他线程修改过的共享变量的值,以及在必须时如何同步的访问共享变量。

什么是happens-before规则?

(1)作用:保证多线程环境下操作的正确性和有序性

(2)A happens-before B保障以下两项内容:

①可见性:B读取到A最新修改的值

②顺序性:编译器优化、处理器重排序等因素不会影响先执行A再执行B的顺序

JVM的内存模型

(1)JVM 内存模型共分为5个区:Java虚拟机栈、本地方法栈、堆、程序计数器、方法区(元空间)

(2)各个区各自的作用:

a.本地方法栈:用于管理本地方法的调用,里面并没有我们写的代码逻辑,其由native修饰,由 C 语言实现。

b.程序计数器:它是一块很小的内存空间,主要用来记录各个线程执行的字节码的地址,例如,分支、循环、线程恢复等都依赖于计数器。

c.方法区(Java8叫元空间):用于存放已被虚拟机加载的类信息,常量,静态变量等数据。

d.Java 虚拟机栈:用于存储局部变量表、操作数栈、动态链接、方法出口等信息。(栈里面存的是地址,实际指向的是堆里面的对象)

e.堆:Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;

相关推荐
测试老哥12 分钟前
外包干了两年,技术退步明显。。。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
ThisIsClark2 小时前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
王佑辉2 小时前
【jvm】内存泄漏与内存溢出的区别
jvm
测试19984 小时前
外包干了2年,技术退步明显....
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
Aphasia3114 小时前
一次搞懂 JS 对象转换,从此告别类型错误!
javascript·面试
大G哥4 小时前
深入理解.NET内存回收机制
jvm·.net
泰勒今天不想展开5 小时前
jvm接入prometheus监控
jvm·windows·prometheus
GISer_Jing6 小时前
2025年前端面试热门题目——HTML|CSS|Javascript|TS知识
前端·javascript·面试·html
上海运维Q先生7 小时前
面试题整理14----kube-proxy有什么作用
运维·面试·kubernetes
开发者每周简报8 小时前
求职市场变化
人工智能·面试·职场和发展