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。
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】安装docker以及可视化界面

1.配置yum下载源为aliyun源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.下载docker不加版本号默认为最新版本 yum install -y docker-ce3.启动以及开机自启 #启动docker命令 systemctl start docker #设置开机自启命令…

免费,Python蓝桥杯等级考试真题--第16级(含答案解析和代码)

Python蓝桥杯等级考试真题–第16级 一、 选择题 答案:B 解析:(75)//212//26,故答案为B。 答案:B 解析:因为x15,所以range(2,15),i的取值为2-14&a…

【机器学习】Pandas中to_pickle()函数的介绍与机器学习中的应用

【机器学习】Pandas中to_pickle()函数的介绍和机器学习中的应用 🌈 欢迎莅临我的个人主页👈这里是我深耕Python编程、机器学习和自然语言处理(NLP)领域,并乐于分享知识与经验的小天地!🎇 &#…

离线deb安装下载及安装实例

1、使用apt download下载deb安装包(不包括依赖包) 1.1仅下载deb安装包 sudo apt download lrzsz 1.2安装载deb安装包 sudo dpkg -i lrzsz_0.12.21-10kylin0k2_arm64.deb 注:dpkg安装deb包,部分存在depends关系,需要使用apt-get -f instal…

Meterpreter工具使用

Meterpreter属于stage payload,在Metasploit Framework中,Meterpreter是一种后渗透工具,它 属于一种在运行过程中可通过网络进行功能扩展的动态可扩展型Payload。这种工具是基于“内存DLL注 入”理念实现的,它能够通过创建一个新进…

项目管理-风险管理

目录 一、概述 二、风险管理的概念 2.1 概述 2.2 风险的定义 2.3 风险的特点 2.3.1 概述 2.3.2 风险承受能力影响因素 2.3.3 风险特点 三、风险的类型 四、风险的管理过程 4.1 概述 4.2 风险管理计划 4.3 风险识别 4.4 风险定性分析 4.5 风险定量分析 4.6 风险应…

【PHP项目实战训练】——laravel框架的实战项目中mysql数据库的数据的数据在blade.php中展示

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

thingsboard接入臻识道闸

thingsboard 和tb-gateway 是通过源码idea启动测试开发 为了测试这里只是买了臻识道闸的摄像机模组方便调试,然后添加一个开关量开关模拟雷达 道闸品牌 臻识C3R3C5R5变焦500万车牌识别相机高速追逃费相机华厦V86像机 淘宝地址 https://item.taobao.com/item.htm?_us1thkikq4…

回顾java-异常

异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。 需…

python探索图表配置的深度与广度

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、基础配置:从全局到细节 示例:颜色与边界的设置 二、文本与标签…

【跟着例子学MySQL】SQL进阶 – 视图、事务和变量

文章目录 前言回顾视图事务用户变量未完待续 前言 举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。 ❔ 为什么要写这个系列? 模仿是最好的老师,实践是检验成果的方法。本系列…

基于VMware安装Linux虚拟机

1.准备Linux环境 首先,我们要准备一个Linux的系统,成本最低的方式就是在本地安装一台虚拟机。为了统一学习环境,不管是使用MacOS还是Windows系统的同学,都建议安装一台虚拟机。 windows采用VMware,Mac则采用Fusion …

视频集中存储LntonCVS视频监控汇聚平台智慧园区应用方案

智慧园区,作为现代化城市发展的重要组成部分,承载着产业升级的使命,是智慧城市建设的重要体现。在当前产业园区竞争日益激烈的情况下,越来越多的用户关注如何将项目打造成完善的智慧园区。 在智慧园区的建设过程中,各类…

PDF打印技巧:如何跳过不需要的页面?如何关闭打印权限?

作为打工人,经常需要打印各种文档,比如PDF文件。今天分享一下PDF文件的两个打印技巧,如果你还不知道,就一起来看看吧! 技巧1:打印PDF如何跳过不需要的页面 有时候,一个PDF文件有很多页&#xf…

Golang | Leetcode Golang题解之第112题路径总和

题目: 题解: func hasPathSum(root *TreeNode, sum int) bool {if root nil {return false}if root.Left nil && root.Right nil {return sum root.Val}return hasPathSum(root.Left, sum - root.Val) || hasPathSum(root.Right, sum - roo…

AI率怎么降低?有哪些论文降重降AI率的工具和方法?

关于aigc降重怎么降重?论文降重有哪些方法?有没有好用的降重软件?网上很多大神都有回答,但是最近还是会有很多学弟学妹会问这些问题! 有没有发现论文降重像玄学一样复杂?最近刚完成一篇论文,使…

【渗透测试】|基于dvwa的CSRF初级,中级,高级

一、渗透测试 二、渗透测试过程中遇到的问题和解决 在初级csrf中&#xff0c;想要通过伪造一个404页面&#xff0c;达到修改密码的效果 伪造404页面的html代码如下&#xff1a; <html> <head> </head> <body> <img src"http://192.xx.xx.xx/…

Docker是什么?使用场景作用及Docker的安装和启动详解

目录 Docker是什么&#xff1f; Docker的发展 Docker的安装 Docker使用 Docker的运行机制 第一个Docker容器 进入Docker容器 客户机访问容器 Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker …

Biological Psychiatry:内源性功能连接的特定模式与强迫症的伤害回避有关

摘要 强迫症(OCD)患者通常在没有实际威胁的情况下表现出持续的回避行为。强迫症对生活质量的影响和患者之间的异质性使得寻找新的大脑-行为干预目标十分有必要。基于啮齿类动物和非人灵长类动物持续回避行为的机制和解剖学研究&#xff0c;本研究的目标是测试持续回避行为相关…

本科java菜鸡,分享腾讯菜鸟京东面试经历

楼主本科菜鸡一个&#xff0c;菜鸟三面挂掉&#xff0c;腾讯二面就挂了&#xff0c;美团携程58集团的笔试做过之后全部都石沉大海&#xff0c;现在实在缺乏实力追求选择空间&#xff0c;望大佬不要嘲笑。这里给大家分享一波面经造福后仁吧。 菜鸟网络 菜鸟是我2月27号就找学长…