JAVA面试题大全(十八)

1、说一下 jvm 的主要组成部分?及其作用?

  • 类加载器(ClassLoader)
  • 运行时数据区(Runtime Data Area)
  • 执行引擎(Execution Engine)
  • 本地库接口(Native Interface)

组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

2、说一下 jvm 运行时数据区域?

JVM 运行时数据区域可以分为以下几个部分:

  1. 程序计数器:当前线程所执行的字节码的行号指示器。
  2. Java 虚拟机栈:描述的是 Java 方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
  3. 本地方法栈:与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行 Java 方法服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。
  4. :Java 堆是 Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
  5. 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

3、 说一下堆栈的区别?

  • 栈内存存储的是局部变量;堆内存存储的是实体;
  • 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
  • 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

4、队列和栈是什么?有什么区别? 

在 JVM(Java 虚拟机)中,队列(Queue)和栈(Stack)是两种常见的数据结构。

队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。它类似于排队,新元素从队列的尾部添加,而元素从队列的头部移除。队列常用于需要按照顺序处理元素的场景,例如任务队列、消息队列等。

栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构。它类似于一叠盘子,新元素总是添加到栈的顶部,而元素总是从栈的顶部移除。栈常用于函数调用、表达式求值等需要后进先出顺序的操作。

以下是队列和栈的一些主要区别:

  1. 数据访问顺序:队列按照先进先出的顺序访问元素,而栈按照后进先出的顺序访问元素。
  2. 添加和删除元素:在队列中,元素从尾部添加,从头部删除;在栈中,元素总是在顶部添加和删除。
  3. 应用场景:队列适用于需要按照顺序处理元素的情况,例如排队、任务调度等;栈适用于需要后进先出顺序的操作,例如函数调用、表达式求值等。
  4. 空间管理:队列的空间可以动态扩展,当队列已满时,可以增加队列的容量;栈的空间通常是固定的,当栈满时会发生栈溢出错误。

在 JVM 中,队列和栈的具体实现可能因不同的 JVM 实现而有所差异。例如,Java 中的Queue接口和Stack类分别提供了队列和栈的基本功能。此外,JVM 还可能使用内部的数据结构来实现队列和栈,以提高性能和效率。

5、什么是双亲委派模型? 

双亲委派模型是 Java 中的一种类加载机制,用于确保类的加载过程的安全性和正确性。

在双亲委派模型中,类加载器被组织成一个层次结构,从顶部到底部依次是启动类加载器、扩展类加载器和应用程序类加载器。当一个类需要被加载时,JVM 会首先将加载请求委派给父类加载器,如果父类加载器无法找到或加载该类,则再由子类加载器尝试加载。

双亲委派模型的主要优点包括:

  1. 安全性:可以避免用户自定义的类覆盖 Java 核心类库中的类,从而保证了 Java 平台的安全性。
  2. 一致性:可以确保同一个类在不同的类加载器中都是同一个实例,从而保证了类的一致性。
  3. 可扩展性:可以方便地实现类的热部署和热替换,从而提高了系统的可扩展性。

总之,双亲委派模型是 Java 中非常重要的一个机制,它保证了类的加载过程的安全性、正确性和一致性。

6、说一下类加载的执行过程?

在 Java 中,类加载的执行过程主要包括以下几个阶段:

  1. 加载:将类的二进制数据从指定的源(如磁盘文件、网络连接等)读取到内存中,并创建一个代表该类的Class对象。
  2. 验证:验证类的字节码是否符合 Java 虚拟机的规范,确保类的正确性和安全性。这一阶段主要包括检查类的结构、语法、语义等。
  3. 准备:为类的静态变量分配内存,并设置默认初始值。这些静态变量将在类的初始化阶段被赋值。
  4. 解析:将类中的符号引用转换为直接引用,以便在运行时能够正确地访问对象的方法和属性。
  5. 初始化:执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。这是类加载的最后一个阶段,也是类真正开始执行的阶段。

需要注意的是,类加载的执行过程是由 Java 虚拟机自动完成的,开发人员通常不需要直接干预。但是,在某些情况下,例如需要动态加载类或实现自定义类加载器时,开发人员可能需要了解类加载的机制和过程。

 7、怎么判断对象是否可以被回收?

  • 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;
  • 可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。 

8、java 中都有哪些引用类型? 

在 Java 中,有以下几种引用类型:

  1. 强引用(Strong Reference):这是最常见的引用类型。当一个对象被强引用引用时,垃圾回收器不会回收该对象,直到所有对该对象的强引用都被删除。
  2. 软引用(Soft Reference):软引用用于描述一些还有用但并非必需的对象。在系统内存不足时,垃圾回收器会回收软引用对象。
  3. 弱引用(Weak Reference):弱引用也是用于描述非必需的对象。与软引用不同的是,垃圾回收器会更积极地回收弱引用对象,只要垃圾回收器发现弱引用对象,就会将其回收。
  4. 虚引用(Phantom Reference):虚引用主要用于跟踪对象的垃圾回收状态。它不能单独使用,必须与引用队列(ReferenceQueue)一起使用。当垃圾回收器准备回收一个对象时,会将该对象的虚引用加入到引用队列中。

9、说一下 jvm 有哪些垃圾回收算法? 

  • 标记-清除算法:只回收,不整理
  • 标记-整理算法:标记-清楚算法的优化,解决了内存碎片的问题
  • 复制算法:解决内存碎片
  • 分代回收算法(常用):年轻代以复制为主,老年代以标记-整理为主

10、详细介绍一下 CMS 垃圾回收器? 

CMS(Concurrent Mark-Sweep),是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。

CMS 使用的是标记-清除算法,所以在 gc 的时候会产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。

11、新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?

新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old、CMS
整堆回收器:G1

新生代垃圾回收器一般采用的是复制算法。复制算法的优点是效率高,缺点是内存利用率低;

老年代垃圾回收器一般采用的是标记-整理算法。

12、说一下 jvm 有哪些垃圾回收器?

  • Serial:最早的单线程串行垃圾回收器,新生代垃圾回收器,使用复制算法。
  • Serial Old:Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选预案,老年代垃圾回收器,使用标记-整理算法。
  • ParNew:是 Serial 的多线程版本,新生代垃圾回收器,使用复制算法。
  • Parallel 和 ParNew 收集器类似是多线程的,但 Parallel 吞吐量优先,可以牺牲等待时间换取系统的吞吐量,新生代垃圾回收器,使用复制算法。
  • Parallel Old 是 Parallel 老年版本,Parallel 使用的是复制算法,Parallel Old 使用的是标记-整理的内存回收算法,是老年代垃圾回收器。
  • CMS:一种以获得最短停顿时间为目标的收集器,非常适用 B/S 系统,老年代垃圾回收器,使用标记-清除算法。
  • G1:一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK 9 以后的默认 GC 选项,是整堆回收器,使用标记-整理算法。

13、简述分代垃圾回收器是怎么工作的? 

分代回收器有两个分区:老生代和新生代。

新生代的默认空间是 1/3,老生代的默认占比是 2/3。

新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下:

把 Eden + From Survivor 存活的对象放入 To Survivor 区;
清空 Eden 和 From Survivor 分区;
From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor 变 From Survivor。

每次在 From Survivor 到 To Survivor 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。

老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。

14、说一下 jvm 调优的工具?

JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。

  • jconsole:用于对 JVM 中的内存、线程和类等进行监控;
  • jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。

15、常用的 jvm 调优的参数都有哪些? 

-Xms2g:初始化堆大小为 2g;
-Xmx2g:堆最大内存为 2g;
-XX:NewRatio=4:设置年轻代和老年代的内存比例为 1:4;
-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。

 16、内存溢出、内存泄露、GC的基本概念

内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露:memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。其实说白了就是该内存空间使用完毕之后未回收。

gc分为full gc 跟 minor gc(Young GC也就是Minor GC),当每一块区满的时候都会引发gc。
 

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

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

相关文章

力扣:15. 三数之和

15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三…

在树莓派3B+中下载opencv(遇到的各种问题及解决)

目录 前言 1、删除原版本下新版本 2、python虚拟环境 3、python版本共存换链接——给版本降低 4、烧录之前版本的文件(在清华源中可以找,不用官网的烧录文件就行; 比如:(balenaEtcher)重新烧录有问题…

上交提出TrustGAIN,提出6G网络中可信AIGC新模式!

月16日至18日,2024全球6G技术大会在南京召开。会上,全球移动通信标准制定组织3GPP(第三代合作伙伴计划)的3位联席主席分享了3GPP6G标准时间表: 2024年9月,启动6G业务需求研究; 2025年6月&…

PHP开发入门

PHP官网:PHP: Hypertext Preprocessor apache官网:https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…

一点连接千家银行,YonSuite让“企业付款”更便利

在快速变化的商业环境中,企业的运营效率直接决定了其市场竞争力。特别是对于财务团队来说,每一次付款的流畅与便捷,都是企业高效运作的关键。今天,我们为您带来一个先进性的解决方案——YonSuite,它以其独特的“一点连…

医学中脑机接口技术的未来

医学中脑机接口技术的未来 李升伟 编译 对非侵入性脑机接口(而不是植入物)日益增长的兴趣可能会提高患者的易使用性,但分辨率需要提高。 图片来源:Denis Pobytov / DigitalVision Vectors / Getty 全球范围内正在展开一场争夺利用…

使用 RT 矩阵进行 3D 点云变换详解(基于 PCL 和 Eigen 库)

在 3D 点云处理中,RT 矩阵是一个常用的工具,用于对点云进行旋转和平移操作。本文将详细介绍 RT 矩阵的概念,并通过一个示例程序演示如何基于 PCL 和 Eigen 库将一帧点云进行矩阵变换再输出。 本教程的示例代码和点云数据可在 GitHub 下载。 什…

多电压档hold扫尾

MMMC下STA收敛更为困难,setup通过DMSA可以很好的得到收敛;但是常规的时序修复工具很难通过工具得到最终clean的时序状态,本文介绍一种多模多角下hold的收敛方法。 该方法主要通过遍历hold路径上多电压setup的余量,支持从前往后和从…

【STM32嵌入式系统设计与开发---传感器拓展】——1_2_蓝牙主从模块_AT配置(HC-05)

一、主机蓝牙设置 # 1、重置模块 ATORGL # 2、设置名字,自己随便设置 ATNAMEMaster # 3、设置连接密码,要和从机一样,密码好像可以不加双引号 ATPSWD"1234" # 4、设置为主机 ROLE 1 为主机 ROLE 0为从机 ATROLE1 # 5、设置波特…

【OpenGL手册14】实例化

目录 一、说明 二、实例化 三、实例化数组 四、小行星带 五、完整代码 六、结论 一、说明 实例化渲染,是用少数数据做模板,实现海量物体渲染的手段方法。用实例化渲染,需要对每个实例产生一定描述数据。如何实现?请看本文下…

docker-compose 映射端口失败! docker端口映射失败 ,docker映射只能使用老端口,映射无法使用

1. 现象 使用docker-compose 启动项目,发现映射端口出现问题,不能映射端口! 如图: 使用原来端口是可以使用的 2. 问题原因: 使用了docker-mode 为host模式,所以不能换端口,只能写为"8086:…

SpringBoot——基于Spring Task实现定时任务

目录 定时任务 项目总结 新建一个SpringBoot项目 pom.xml无需引入依赖 SpringTaskDemo SpringbootSpringtaskApplication启动类 定时任务 在日常的项目开发中,往往会涉及一些需要做到定时执行的代码,例如自动将超过24小时的未付款的订单改为取消状…

【调试笔记-20240522-Windows-WSL 修改已安装发行版名称】

调试笔记-系列文章目录 调试笔记-20240522-Windows-WSL 修改已安装发行版名称 文章目录 调试笔记-系列文章目录调试笔记-20240522-Windows-WSL 修改已安装发行版名称 前言一、调试环境操作系统:Windows 10 专业版调试环境调试目标 二、调试步骤方法一:修…

数字化校园的特征

"数字化校园"是校园信息化进入高级阶段的表现形式,信息技术与教育教育的交融应该更深化。因而,数字化校园应该具以下特征: 1.互联网络高速发展 网络是信息时代的根基,没有网络就无法完成教育信息化的绝大部分作业。数字…

Go Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8二、邮箱服务配置,以QQ邮箱为例 三、示例代码 package mainimport ("context""fmt"redis "github.com/go-redis/redis/v8""gopkg.in/gomail.v2""gopkg.in/ini.v1"&quo…

总结 HTTP 协议的基本格式

一、HTTP 是什么 HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议 . HTTP 诞生与 1991 年 . 目前已经发展为最主流使用的一种应用层协议 . HTTP 协议目前有三个大版本: HTTP / 1 和 HTTP / 2 都是基于TCP 传输控制协议传输数据。最新版本的…

60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置

UE的Environment Query System(EQS)是环境查询系统,它是UE4和UE5中用于AI决策制定过程中的数据采集和处理的一个强大工具。EQS可以收集场景中相关的数据,利用生成器(Generator)针对用户的测试(T…

基于SpringBoot的旅游管理系统

基于SpringBoot的旅游管理系统 旅游管理系统开发技术功能模块代码结构数据库设计运行截图源码获取 旅游管理系统 开发技术 技术:SpringBoot、MyBatis-Plus、MySQL、Beetl、Layui。 框架:基于开源框架Snowy-Layui开发。 工具:IDEA、Navicat等…

Python 读取.shp文件并生成图幅编号

代码适用于需要处理和分析地理空间数据的场景,如城市规划、环境监测或自然资源管理,其中它可以帮助用户读取特定区域的Shapefile文件,确定其地理边界,并基于这些边界计算出按照经纬度5度间隔的图幅编号,进而用于地图制…

django中,无法跳转到请求的html页面?

出现错误: You’re seeing this error because you have DEBUG True in your Django settings file. Change that to False, and Django will display a standard 404 page. 在urls中,注释了系统的默认配置,这时就需要在setting配置文件中&…