当前位置: 首页 > news >正文

JVM高频面试题

1、项目中什么情况下会内存溢出,怎么解决?

	(1)误用固定大小线程池导致内存溢出  Excutors.newFixedThreadPool内最大线程数是21亿(2) 误用带缓冲线程池导致内存溢出最大线程数是21亿(3)一次查询太多的数据,导致内存占用太大(4)动态生成类导致内存溢出

2、类加载过程?

三个过程:加载:

在这里插入图片描述
链接:
在这里插入图片描述
链接又分为:验证、准备、解析

	初始化:

在这里插入图片描述
总结:所谓类加载机制就是:虚拟机把Class文件加载到内存,并对数据进行校验、转换解析和初始化,形成虚拟机可以直接使用的Java类型,即java.lang.class

补充:类.class只会触发类加载且只会加载一次,而new 类()则会触发类初始化。静态变量的赋值在初始化时完成。

3、什么是双亲委派?
在这里插入图片描述

4.对象引用分为哪几类?

	1.强引用

在这里插入图片描述
正常对象引用

		2.软引用

在这里插入图片描述
系统内存足够时不会被回收,不足时才会被回收。且若回收之后仍内存不够,则会内存溢出
3.弱引用
在这里插入图片描述
无论内存是否充足都会被回收
4.虚引用
在这里插入图片描述
主要用来跟踪对象被垃圾回收的过程,任何时候都可能被垃圾回收

5、堆(heap)和栈(stack)有什么区别?
1、内存分配方式不同:堆是动态分配内存空间的;栈是静态分配内存空间的。
2、内存空间大小不同:堆的内存空间通常比较大,可以动态扩展;而栈的内存空间通常比较小,由于静态分配,所以大小固定。
3、内存分配效率不同:堆的内存分配效率相对较低,因为需要进行垃圾回收和内存整理等操作;而栈的内存分配效率相对较高,因为只需要简单地移动指针即可。
4、存储内容不同:堆用于存储对象实例和数组等动态数据,它具有很好的灵活性;而栈用于存储方法调用的局部变量和操作数栈等数据,它具有很好的局部性和快速访问的特点。

6、什么情况下会发生栈内存溢出?

方法调用层次过深:如果方法调用层次过深,每次方法调用都会在栈中创建一个新的栈帧,如果栈空间不足,就会导致栈内存溢出。
局部变量过多:如果方法中定义了大量的局部变量,也会占用栈空间,如果栈空间不足,就会导致栈内存溢出。
递归调用:递归调用会不断地向栈中添加新的方法调用,如果递归深度过大,就会导致栈内存溢出。
参数传递过多:如果方法参数传递过多,也会占用栈空间,如果栈空间不足,就会导致栈内存溢出。
大量线程调用:如果同时有大量的线程在栈中进行方法调用,也会占用栈空间,如果栈空间不足,就会导致栈内存溢出。

7、什么是OOM?
OOM 是 OutOfMemoryError 的缩写,是指在 Java 程序运行期间,由于内存不足而导致程序出现错误的情况。OOM 错误通常分为堆内存溢出和非堆内存溢出两种情况。

8、如何判断一个对象是否存活?

	1、引用计数法:引用计数法是一种简单的垃圾回收算法,它通过统计对象的引用计数,来判断对象是否存活。每当一个对象被引用时,它的引用计数加 1,当一个对象的引用计数为 0 时,说明该对象已经不再被使用,可以被垃圾回收器回收。但是,引用计数法无法处理循环引用的情况,即两个或多个对象相互引用,导致它们的引用计数都不为 0,无法被回收。2、可达性分析法:可达性分析法是一种常用的垃圾回收算法,它通过从一组根对象开始,查找所有被这组根对象所引用的对象,以此来确定哪些对象是存活的。在可达性分析法中,根对象可以是程序中的静态变量、本地变量或者正在执行的线程等。当一个对象无法被根对象所引用时,说明该对象已经不再被使用,可以被垃圾回收器回收。

可达性分析法是 Java 中常用的判断对象存活的方式,它考虑了对象之间的引用关系,可以处理循环引用的情况,而引用计数法则无法处理循环引用的情况,因此在 Java 中并不采用引用计数法来判断对象是否存活。

9、有哪几种垃圾回收器?各自的优点是什么?
Serial 垃圾回收器:是一种单线程的垃圾回收器,它使用标记-清除算法来回收垃圾对象。优点是简单高效,适合小型应用场景,但是在多核处理器上的表现较差。

Parallel 垃圾回收器:是一种多线程的垃圾回收器,它使用标记-整理算法来回收垃圾对象。优点是在多核处理器上的表现比 Serial 垃圾回收器更好,适合中型应用场景。

CMS 垃圾回收器:是一种并发的垃圾回收器,它使用标记-清除算法来回收垃圾对象。优点是回收效率高,暂停时间短,适合大型应用场景。但是,CMS 垃圾回收器会产生内存碎片,可能会导致频繁的 Full GC,影响应用性能。

G1 垃圾回收器:是一种并发的垃圾回收器,它使用标记-整理算法来回收垃圾对象。优点是在大型应用场景下表现良好,可以有效避免内存碎片和频繁的 Full GC。同时,G1 垃圾回收器还支持设置可预测的暂停时间,使得应用程序的性能得到进一步优化。可以优先回收大块垃圾的区域

Serial和CMS都是标记清楚,Parallel和G1都是标记整理。G1现在用的最多。

10、什么是JVM内存结构?
JVM分为堆、虚拟机栈、本地方法栈、程序计数器、方法区

虚拟机栈里有局部变量表、操作数栈、动态链接、方法返回信息

本地方法栈:是C栈,执行本地方法

程序计数器:用于记录当前虚拟机正执行的线程指令地址

堆:所有线程共享的一块内存,虚拟机开启时就创建,可通过GC进行回收。

方法区:jdk1.8之后叫元数据区

相关文章:

JVM高频面试题

1、项目中什么情况下会内存溢出,怎么解决? (1)误用固定大小线程池导致内存溢出 Excutors.newFixedThreadPool内最大线程数是21亿(2) 误用带缓冲线程池导致内存溢出最大线程数是21亿(3)一次查询太多的数据,导致内存占用…...

Windows环境下实现设计模式——状态模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现状态模式(设计模式)。不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式,无…...

【总结】多个条件排序(pii/struct/bool)

目录 pii struct bool pii 现在小龙同学要吃掉它们,已知他有n颗苹果,并且打算每天吃一个。 但是古人云,早上金苹果,晚上毒苹果。由此可见,早上吃苹果和晚上吃苹果的效果是不一样的。 已知小龙同学在第 i 天早上吃苹果能…...

基于stm32mp157 linux开发板ARM裸机开发教程Cortex-A7 开发环境搭建(连载中)

前言:目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中,使其内容更加丰富,讲解更加细致,全文所使用的开发平台均为华清远见FS-MP1A开发板(STM32MP157开发板)针对对FS-MP1A开发板&#xff…...

最适合游戏开发的语言是什么?

建议初学者学习主流的开发技术 主流开发技术有大量成熟的教程、很多可以交流的学习者、及时的学习反馈等;技术的内里基本都是相同的,学习主流技术的经验、知识可以更好更快地疏通学习新知识和技术。 因此,对C#或者C二选一进行学习较好。 Un…...

C语言刷题(7)(字符串旋转问题)——“C”

各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是复习之前的知识点,那么,就是做一道小小的题目啦,下面,让我们进入C语言的世界吧 实现一个函数,可以左旋字符串中的k个字符。 例如: A…...

有趣且重要的JS知识合集(18)浏览器实现前端录音功能

1、主题描述 兼容多个浏览器下的前端录音功能,实现六大录音功能: 1、开始录音 2、暂停录音 3、继续录音 4、结束录音 5、播放录音 6、上传录音 2、示例功能 初始状态: 开始录音: 结束录音: 录音流程 &#xf…...

面试官:聊聊你知道的跨域解决方案

跨域是开发中经常会遇到的一个场景,也是面试中经常会讨论的一个问题。掌握常见的跨域解决方案及其背后的原理,不仅可以提高我们的开发效率,还能在面试中表现的更加游刃有余。 因此今天就来和大家从前端的角度来聊聊解决跨域常见的几种方式。…...

SpringCloud五大核心组件

Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。 服务发现——Netflix Eureka …...

Verilog HDL语言入门(二)

强烈建议用同步设计2.在设计时总是记住时序问题3.在一个设计开始就要考虑到地电平或高电平复位、同步或异步复位、上升沿或下降沿触发等问题,在所有模块中都要遵守它4.在不同的情况下用if和case,最好少用if的多层嵌套(1层或2层比较合适&#…...

Simpleperf详细使用

一、Simpleperf介绍 Simpleperf是一个强大的命令行工具,它包含在NDK中,可以帮助我们分析应用的CPU性能。Simpleperf可以帮助我们找到应用的热点,而热点往往与性能问题相关,这样我们就可以分析修复热点源。 如果您更喜欢使用命令…...

【算法基础】二分图(染色法 匈牙利算法)

一、二分图 1. 染色法 一个图是二分图,当且仅当,图中不含奇数环。在判别一个图是否为二分图⑩,其实相当于染色问题,每条边的两个点必须是不同的颜色,一共有两种颜色,如果染色过程中出现矛盾,则说明不是二分图。 for i = 1 to n:if i 未染色DFS(i, 1); //将i号点染色未…...

Caputo 分数阶微分方程-慢扩散方程初边值问题基于L1 逼近的空间二阶方法及其Matlab程序实现

2.3.3 Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法 考虑如下时间分数阶慢扩散方程初边值问题 { 0 C D t α u ( x , t ) = u...

I.MX6ULL_Linux_驱动篇(29) GPIO驱动

Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。所以本篇的 LED 灯驱动最终也是对 I.MX6ULL 的 IO 口进行配置,与裸机实验不同的是,在 Linux 下编写驱动要符合 Linux 的驱动框架。I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 …...

jupyter的安装和使用

目录 ❤ Jupyter Notebook是什么? notebook jupyter 简介 notebook jupyter 组成 网页应用 文档 主要特点 ❤ jupyter notebook的安装 notebook jupyter 安装有两种途径 1.通过Anaconda进行安装 2.通过pip进行安装 启动jupyter notebook ❤ jupyter …...

Springboot新手开发 Cloud篇

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:后端专栏 📧如果文章知识点有错误的地方,…...

Linux:函数指针做函数参数

#include <stdio.h> #include <stdlib.h> //创建带有函数指针做参数的函数框架api //调用者要先实现回调函数 //调用者再去调用函数框架 //所谓的回调是指 调用者去调用一个带有函数指针做参数的函数框架&#xff0c;函数框架反过来要调用调用者提供的回调函数 …...

Vue3(递归组件) + 原生Table 实现树结构复杂表格

一、递归组件 什么是递归&#xff0c;Javascript中经常能接触到递归函数。也就是函数自己调用自己。那对于组件来说也是一样的逻辑。平时工作中见得最多应该就是菜单组件&#xff0c;大部分系统里面的都是递归组件。文章中我做了按需引入的配置&#xff0c;所以看不到我引用组…...

ArrayList底层源码解析

Java源码系列&#xff1a;下方连接 http://t.csdn.cn/Nwzed 文章目录前言一、**ArrayList底层结构和源码分析**无参构造调用创建ArrayList集合无参构造总结&#xff1a;发文3个工作日后 up 会把总结放入前言部分&#xff0c;但也诚邀读者总结&#xff0c;可放入评论区有参构造…...

python:DIY字符画的程序使用说明.doc

目录开发环境要求运行方法具体的操作步骤如下&#xff1a;代码示例源码及运行程序下载地址开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统&#xff1a;Windows 7、Windows 10。 Python版本&#xff1a;Python 3.7.0。 开发工具&#xff1a;Python IDLE。 …...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...