【JVM】面试题汇总

news2024/12/26 22:57:08

  • JVM
    • 1. 什么是JVM?
    • 2. 了解过字节码文件的组成吗?
    • 3. 什么是运行时数据区
    • 4. 哪些区域会出现内存溢出
    • 5. JVM在JDK6-8之间在内存区域上有什么不同
    • 6. 类的生命周期
    • 7. 什么是类加载器?类加载器有哪几种
    • 8. 什么是双亲委派机制?有什么好处
    • 9. 如何打破双亲委派机制
    • 10. 如何判断堆上的对象有没有被引用?
    • 11. JVM 中都有哪些引用类型?
    • 12. ThreadLocal中为什么要使用弱引用?
    • 13. 有哪些常见的垃圾回收算法?
    • 14. 分代GC算法为什么将堆分成新生代和老年代?
    • 15. 有哪些常用的垃圾回收器
    • 16. 内存泄漏的原因

JVM

1. 什么是JVM?

答:

  • JVM 是运行 Java字节码文件的虚拟机,字节码文件和不同系统实现的JVM是实现跨平台的关键。
  • JVM的功能有三项:
    • 第一是解释执行字节码指令;
    • 第二是管理内存中对象的分配,完成自动的垃圾回收;
    • 第三是优化热点代码提升执行效率 (JIT)。
  • JVM组成分为类加载子系统运行时数据区执行引擎本地接口这四部分。
  • 常用的JVM是Oracle提供的Hotspot虚拟机,也可以选择GraalVM、龙井(阿里)、OpenJ9等虚拟机。

2. 了解过字节码文件的组成吗?

答:

  • 字节码文件包括:
    • 基本信息:魔数,字节码文件对应的版本号、父类、接口等信息。
    • 常量池:保存了字符串常量、类或接口名、字段名等,主要在字节码指令中被引用。
    • 字段:当前类或接口声明的字段信息。
    • 方法:当前类或接口声明的方法中的字节码指令
    • 属性:类的属性。

可以使用 javap -v 字节码文件.Class 命令反编译查看对应字节码的信息

3. 什么是运行时数据区

答:

运行时数据区指的是JVM所管理的内存区域,其中分成两大类:

  • 线程共享
    • 堆内存:创建出来的对象都存在于堆上。静态变量也是在堆内存(Class对象中)。
    • 方法区:类的基础信息、运行时常量池(保存了字节码文件中的常量池内容)、字符串常量池
  • 线程不共享
    • 程序计数器:记录下一条要执行的字节码指令的地址。
    • Java虚拟机栈:记录执行方法的栈帧。
    • 本地方法栈:记录native本地方法的栈帧。

4. 哪些区域会出现内存溢出

答:

  • :溢出之后会抛出OutOfMemoryError,并提示是Java heap Space导致的。
    • 调整堆的大小:-Xmx值(max的最大值) -Xms值(初始的total)
  • :溢出之后会抛出StackOverflowError
    • 调整虚拟机栈的大小:-Xss栈大小
  • 方法区:溢出之后会抛出OutOfMemoryError,JDK7及之前提示永久代,JDK8及之后提示元空间
    • 调整永久代(-XX:MaxPermSize=值),调整元空间(-XX:MaxMetaspaceSize=值
  • 直接内存:溢出之后会抛出OutOfMemoryError
    • 调整直接内存: -XX:MaxDirectMemorySize=值

5. JVM在JDK6-8之间在内存区域上有什么不同

答:

  • 方法区的实现
    • JDK 7及之前:方法区是在堆中的永久代
    • JDK 8之后:方法区是在直接内存的元空间,永久代被移除
  • 字符串常量池的位置
    • JDK 6及之前:字符串常量池是在方法区上
    • JDK 7及之后:字符串常量池从方法区移除,放在堆中

6. 类的生命周期

答:

  • 加载
    • 类加载器根据类的全限定名以二进制流的方式获取字节码信息。
    • 方法区上创建类的信息。
  • 连接
    • 验证:验证字节码文件是否符合规范
    • 准备:为静态变量(static)分配内存并设置初值。final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。
    • 解析:将常量池中的符号引用替换为直接引用
  • 初始化
    • 初始化阶段会执行静态代码块中的代码,并为静态变量赋值。注意:他们的执行顺序按编写的顺序加载。
    • 初始化阶段会执行字节码文件中clinit部分的字节码指令。
  • 卸载:同时满足以下3个条件可以被卸载
    • 此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。
    • 加载该类的类加载器已经被回收。
    • 该类对应的 java.lang.Class 对象没有在任何地方被引用。

7. 什么是类加载器?类加载器有哪几种

答:

类加载器: 负责把字节码文件读取到JVM内存中。

  • 启动类加载器(Bootstrap):默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等。
  • 扩展类加载器:默认加载Java安装目录/jre/lib/ext下的类文件
  • 应用程序类加载器:默认加载为应用程序classpath下的类文件。
  • 自定义类加载器:继承ClassLoader抽象类,重写findClass方法。在findClass方法中,定义从哪里读取字节码文件,然后调用defineClass方法,在方法区和堆区创建对象。

在这里插入图片描述

8. 什么是双亲委派机制?有什么好处

答:

  • 当一个类加载器要加载字节码文件时,首先向上查找父类加载器是否加载过,
  • 如果加载过,则直接返回。
  • 如果一直到顶级类加载器(Bootstrap)也没有加载过,则再从上至下尝试加载。

好处:

  • 保证JDK的核心类库不会被替换。
  • 避免类的重复加载

在这里插入图片描述

9. 如何打破双亲委派机制

答:

  • 实现自定义类加载器:首先继承ClassLoader抽象类,重写loadClass方法,将双亲委派机制的代码去除。
  • 然后编写从指定位置加载字节码,最后调用defineClass方法,在方法区和堆区创建对象。

在这里插入图片描述

10. 如何判断堆上的对象有没有被引用?

答:

可以使用引用计数法可达性分析法来判断

  • 引用计数法:每个对象都有一个引用计数器,当对象被引用时加1,取消引用时减1。为0时则说明没有被引用。缺点:存在循环引用。
  • 可达性分析法:将对象分类两类,根对象普通对象。从根对象(线程对象、静态变量、监视器对象等)出发,顺着引用链可以到达某个对象,则该对象说明被引用。

11. JVM 中都有哪些引用类型?

答:

  • 强引用:默认就是强引用,即对象被局部变量、静态变量所引用。强引用的对象不会被回收掉
  • 软引用:SoftReference类实现。当一个对象只被软引用对象引用,并且内存空间不足时,进行垃圾回收,则会回收被软引用指向的对象。可以把软引用对象本身放到引用队列中,回收软引用对象本身。
  • 弱引用:WeakReference类实现。不管内存空间够不够,在垃圾回收时,弱引用指向的对象都会被回收。弱引用对象本身也可以使用引用队列回收。
  • 虚引用:PhantomReference类实现。作用:告诉直接内存,当前指向直接内存的对象不再使用,回收直接内存空间吧。
  • 终结器引用:分两次垃圾回收才会把对象回收,不建议使用。

12. ThreadLocal中为什么要使用弱引用?

答:

  • 在ThreadLocal内部, 存放了一个ThreadLocalMap对象(哈希表),ThreadLocalMap中存放的是多个Entry对象。
  • 每个Entry对象继承自弱引用,指向ThreadLocal对象。同时强引用指向ThreadLocal对应的value值
  • 如果不使用弱引用的话,假如ThreadLocal对象不再使用了,那么ThreadLocal对象不会被回收,因为被Entry对象强引用。

在这里插入图片描述

13. 有哪些常见的垃圾回收算法?

答:

1、标记清除算法

根据可达性分析算法,将所有存活的对象进行标记

在清除阶段,将未被标记的对象进行清除

缺点: 容易产生大量的内存碎片

2、复制算法

将堆内存空间划分成两部分,from区和to区

新创建的对象会被放入到from区。进行垃圾回收的时候,将from区中存活的对象复制到to区

然后将from区和to区互相换个名字

缺点: 堆内存空间利用低

3、标记整理算法

根据可达性分析算法,将所有存活的对象进行标记

整理阶段,将所有存活的对象放到堆的一端,之后清理掉这些对象的内存。

缺点: 整理的效率低

4、分代垃圾回收

将堆内存分为新生代、老年代

新生代又分为:伊甸园、幸存区from、幸存区to

新创建的对象会被放到伊甸园中。

如果伊甸园满了,则会进行Minor GC。

将伊甸园和幸存区from中的存活对象复制到幸存区to中。

清理伊甸园和幸存区from。之后幸存区from、幸存区to互换名字

每次发生MInor GC时,存活的对象年龄 + 1,当到达15时,则会被放到老年代中。

如果老年代满了,首先会触发Minor GC,如果新生代还是放不下,则会触发Full GC。

如果Full GC之后,老年代还放不下,则会爆出OOM。

14. 分代GC算法为什么将堆分成新生代和老年代?

答:

  • 新生代和老年代可以使用不同的回收算法,更灵活。
  • 可以通过调整新生代和老年代大小的比例,来适应不同的应用程序。

15. 有哪些常用的垃圾回收器

答:

单线程的垃圾回收器:

  • Serial 回收新生代、采用复制算法
  • SerialOld 回收老年代、采用标记-整理算法
  • 缺点:单核CPU优异多核CPU吞吐量不如其他垃圾回收器

多线程的垃圾回收器:

  • ParNew 回收新生代、采用复制算法
  • CMS(Concurrent Mark Sweep) 回收老年代、采用标记-清除算法
  • 会产生内存碎片

G1垃圾回收器

  • JDK 9之后,默认的垃圾回收器
  • 回收年轻代、老年代 采用复制算法

16. 内存泄漏的原因

答:

  • 大量的数据被静态变量长期引用。
  • 资源没有关闭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HJ43 迷宫问题(动态规划,从(0,0)开始,四个方向遍历,深度优先搜索,找到一条路径。)

从(0,0)开始,四个方向遍历,深度优先搜索,找到一条路径。 import java.util.Scanner; import java.util.ArrayList;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stati…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分; ​ 假设前8位用来区分不同的国家,国际路由器负责全球数据传输,子网掩码为IP/8;次6位区分不同的省份,国内路由器负责全国数据的传输…

微服务学习3

目录 1.微服务保护 1.1.服务保护方案 1.1.1.请求限流 1.1.2.线程隔离 1.1.3.服务熔断 1.2.Sentinel 1.2.1.微服务整合 1.2.2.请求限流 1.3.线程隔离 1.3.1.OpenFeign整合Sentinel 1.3.2.配置线程隔离 1.4.服务熔断 1.4.1.编写降级逻辑 1.4.2服务熔断 2.分布式事…

threejs 基础知识点汇总

threejs 基础知识点汇总 之前写了几篇博文,但是我觉得写的不好,我今天再补充一篇还不好的,把基础知识点汇总一下,不写运行的代码了,只写关键代码,但是看了之前我写的那几篇,看这篇的话问题其实不…

OpenCV C++学习笔记

1.图像的读取与显示 1.1 加载并显示一张图片 #include<opencv2/opencv.hpp> #include<iostream>using namespace cv; using namespace std; int main(int argc,char** argv){Mat srcimread("sonar.jpg");//读取图像if(src.empty()){printf("Could…

大型语言模型如何助力推荐系统:综述研究

论文地址&#xff1a;https://arxiv.org/pdf/2306.05817.pdf 这篇论文主要探讨了推荐系统&#xff08;RS&#xff09;如何从大型语言模型&#xff08;LLM&#xff09;中获益。论文首先指出&#xff0c;随着在线服务和网络应用的快速发展&#xff0c;推荐系统已成为缓解信息过载…

解决使用php将excel数据导入数据库报错问题

今天在用 phpexcel 将数据xlxs数据导入到数据库发现一直报错 Array and string offset access syntax with curly braces is no longer supported 百度下发现PHP7.4后面版本,不再能够使用花括号来访问数组或者字符串的偏移&#xff0c;而我当前php版本是8.1 没办法根据他这个…

Linux 系统下对于 MySQL 的初级操作

由于公司老板想把早已封存的服务器陈年老码捣鼓一下&#xff0c;所以找了一个外援&#xff0c;我则是配合提供支持。但是过程并不顺利。至少 5 年以上的间隔&#xff0c;导致外援查看的时候发现很多代码和配置是缺失的&#xff0c;目前卡在数据库部分&#xff0c;而我这边就帮忙…

Mac 装 虚拟机 vmware、centos7等,21年网络安全面经分享

链接: https://pan.baidu.com/s/1oZw1cLyl6Uo3lAD2_FqfEw?pwdzjt4 提取码: zjt4 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 centos8 链接: https://pan.baidu.com/s/10KWpCUa2JkwcjYlJZVogKQ?pwdn99a 提取码: n99a 复制这段内容后打开百度网盘手机App&…

Nginx反向代理与Tomcat实现ssm项目前后端分离部署

Nginx nginx是一款http和支持反向代理的web服务器&#xff0c;以其优越的性能被广泛使用。以下是百度百科的介绍。 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.…

echarts 如何设置(dataZoom)多个图形的数据区域一起联动缩放响应

数据区域联动缩放需要用到 dataZoom 的专属事件 dispatchAction 实现多个数据区域联动缩放功能 <div style"width:100%;height:320px;" id"test01"></div> <div style"width:100%;height:320px;" id"test02"></…

AI大模型探索之路-应用篇2:Langchain框架ModelIO模块—数据交互的秘密武器

目录 前言 一、概述​​​​​​​ 二、Model 三、Prompt 五、Output Parsers 总结 前言 随着人工智能技术的不断进步&#xff0c;大模型的应用场景越来越广泛。LangChain框架作为一个创新的解决方案&#xff0c;专为处理大型语言模型的输入输出而设计。其中&#xff0c;…

苍穹外卖11(Apache ECharts前端统计,营业额统计,用户统计,订单统计,销量排名Top10)

目录 一、Apache ECharts【前端】 1. 介绍 2. 入门案例 二、营业额统计 1. 需求分析和设计 1 产品原型 2 业务规则 3 接口设计 2. 代码开发 3. 功能测试 三、用户统计 1. 需求分析和设计 1 产品原型 2 业务规则 3 接口设计 2. 代码开发 3. 功能测试 四、订单统…

Harmony鸿蒙南向驱动开发-DAC

DAC&#xff08;Digital to Analog Converter&#xff09;是一种通过电流、电压或电荷的形式将数字信号转换为模拟信号的设备。 DAC模块支持数模转换的开发。它主要用于&#xff1a; 作为过程控制计算机系统的输出通道&#xff0c;与执行器相连&#xff0c;实现对生产过程的自…

通过本机调试远端路由器非直连路由

实验目的&#xff1a;如图拓扑&#xff0c;通过本机电脑发&#xff0c;telnet调试远程AR4设备。 重点1&#xff1a;通过ospf路由协议配置拓扑网络&#xff0c;知识点&#xff1a;ospf配置路由器协议语法格式&#xff0c;area区域的定义&#xff0c;区域内网络的配置&#xff0…

蓝桥杯加训

1.两只塔姆沃斯牛&#xff08;模拟&#xff09; 思路&#xff1a;人和牛都记录三个数据&#xff0c;当前坐标和走的方向&#xff0c;如果人和牛的坐标和方向走重复了&#xff0c;那就说明一直在绕圈圈&#xff0c;无解 #include<iostream> using namespace std; const i…

idea keymap用eclipse的相关快捷键

idea快捷键用eclipse的方式 CtrlShiftR 搜索文件shiftshift 全部文件/类搜索CtrlH 全局搜索CtrlO 快速打开Outline大纲视图ctrle 查看recent窗口文件

排序算法,归并排序

归并排序是什么 归并排序&#xff08;Merge Sort&#xff09;是建立归并操作上的一种有效&#xff0c;稳定的排序算法&#xff0c;该算法是采用分治法的一个非常典型的应用 将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序&#xff0c;…

element UI table合并单元格方法

废话不多讲&#xff0c;直接上代码&#xff0c;希望能帮到需要的朋友 // 合并单元格function spanMethod({ row, column, rowIndex, columnIndex }) {//定义需要合并的列字段&#xff0c;有哪些列需要合并&#xff0c;就自定义添加字段即可const fields [declareRegion] // …

智能工业电脑在智慧电力中实现全程实时监控与调控

可视化编程工业电脑在化工、石油、电力等行业过程控制领域扮演着越来越重要的角色。这些基于ARM架构设计的嵌入式工业计算机凭借其高性能、低功耗以及出色的实时处理能力&#xff0c;有效提升了各行业生产过程的安全性和效率。 钡铼技术ARMxy系列采用嵌入式Linux 系统开发的产品…