JVM面试题

JVM跨平台的原理

在这里插入图片描述
它就和其他软件一样,是操作系统中的一个进程
不管它里面运行的是啥程序,它本身只是一个软件
在这里插入图片描述
就和mac版本的QQ和windows版本的QQ不一样类似

字节码的作用

在这里插入图片描述
如果jvm的作用是直接解析Java代码的话,它就变成了类似于Python的解释器的工具
Java代码直接解析比较慢,因为Java是高级语言,是由C语言和C++编写的语言
所以将Java代码转换为字节码,比较耗时的这部分工作就变成了编译期间的工作
提高了运行时候的效率

JVM与字节码的关系

在这里插入图片描述

JVM整体结构

在这里插入图片描述
JIT编译器:负责把一些比较频繁的,已经解释过的字节码缓存起来,避免重复解释
本地方法栈:一般是一些jvm里面的,C语言或者C++编写的方法,带native关键字
堆:解释过程中将产生的对象放到堆里面
程序计数器:方便解释器找到下一条要执行的指令

类加载子系统

在这里插入图片描述
将符号引用解析为直接引用是指将实际上类的名字等信息转化为存在方法区里面的地址

类加载器的分类

在这里插入图片描述
ExtClassLoader是Java类库下的加载器
AppClassLoader是当前项目classpath下面的加载器

类加载器的双亲委派机制

在这里插入图片描述
当在Java中创建一个class后
jvm会去看appClassLoader中是否加载过这个类,
没有加载再去ExtClassLoader中找,还没有再去BootStrapClassLoader中找
都没有再创建一个新的

Tomcat为什么要自定义类加载器

在这里插入图片描述

运行时数据区的内容

在这里插入图片描述
蓝色是线程共享的
绿色是非线程共享的,每个线程都有一个

程序计数器

在这里插入图片描述

虚拟机栈

在这里插入图片描述
图解
在这里插入图片描述
虚拟机栈可能出现的问题
在这里插入图片描述

栈帧

在这里插入图片描述

操作数栈

在这里插入图片描述
在这里插入图片描述
上述代码中
局部变量表一直不断存储变化的值
在这里插入图片描述

通过字节码的指令变化,不断在操作数栈和局部变量表中存取数据,实现代码逻辑

本地方法栈

在这里插入图片描述

在这里插入图片描述
堆的调整参数
在这里插入图片描述
新生代和老年代的调整参数
在这里插入图片描述
在这里插入图片描述

对象在堆中是如何流转的

在这里插入图片描述
Eden区域如果满了之后,会扫描哪些对象是已经没有在使用的对象
在这里插入图片描述
会把这些对象进行youngGC,标记数字,放到S0
在这里插入图片描述
如果eden再次发生youngGC时,会同步扫描S0区,并把对象转移到S1中,并同步更新数字
这次eden中的对象不是到S0了,而是S1,他俩区域会不断切换,不断更新数字
在这里插入图片描述
超过15次的,就会被放到老年代
在这里插入图片描述
特别大的对象也有可能不经过S0和S1直接放到老年代
在这里插入图片描述
也有可能Eden放不下,不经过Eden直接到老年代
在这里插入图片描述

GC的分类

在这里插入图片描述

为什么要进行GC

在这里插入图片描述

垃圾标记的方法

在这里插入图片描述

引用计数法

在这里插入图片描述

可达性分析法

在这里插入图片描述

GCroot包括什么

在这里插入图片描述

标记清除算法

在这里插入图片描述
在这里插入图片描述

STW是Stop-The-World的缩写,指的是在垃圾回收算法执行过程中,需要将JVM内存冻结的一种状态。在STW状态下,除了GC线程以外,其他所有线程都会停止执行。
STW是不可避免的,垃圾回收算法的执行一定会出现STW,而我们最好的解决办法就是减少停顿的时间。GC各种算法的优化重点就是为了减少STW,这也是JVM调优的重点。

复制算法

在这里插入图片描述
在这里插入图片描述

标记整理算法

在这里插入图片描述
在这里插入图片描述

三种不同的算法对比

在这里插入图片描述

分代收集算法

在这里插入图片描述

常见的垃圾回收器

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java虚拟机(JVM)是负责运行Java应用程序的软件。下面是一些常见的Java JVM面试题及其答案: 1. 元空间会产生内存溢出吗?在什么情况下会产生内存溢出? 元空间不会产生内存溢出。元空间是JVM中用于存储类和元数据的区域,它的大小不受JVM堆内存限制。当元空间中的类和元数据数量超过了元空间的限制,会抛出OutOfMemoryError错误。 2. JVM内存模型中的哪些区域是线程私有的? JVM内存模型中,线程私有的区域包括程序计数器、虚拟机栈和本地方法栈。 3. 什么是OOM异常?它通常在什么情况下发生? OOM(Out of Memory)异常表示内存溢出。当JVM无法为应用程序分配足够的内存时,就会抛出OOM异常。常见的内存溢出情况包括堆内存不足、栈溢出和元空间溢出。 4. JVM的垃圾回收算法有哪些? JVM的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法。 5. 什么是垃圾回收器?JVM中有哪些常见的垃圾回收器? 垃圾回收器是负责执行垃圾回收的组件。在JVM中,常见的垃圾回收器包括Serial、Parallel、CMS和G1等。 6. JVM调优的方法有哪些? JVM调优的方法包括调整堆内存大小、选择合适的垃圾回收器、优化代码以减少内存占用、减少对象的创建和销毁等。 7. 什么是类加载器?有哪些不同类型的类加载器? 类加载器负责将类字节码加载到JVM中,并在运行时动态加载类。在Java中,常见的类加载器包括启动类加载器(Bootstrap Class Loader)、扩展类加载器(Extension Class Loader)和应用程序类加载器(Application Class Loader)。 8. JVM的性能调优工具有哪些? JVM的性能调优工具包括jstat、jmap、jstack、VisualVM等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值