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开发板ÿ…...
最适合游戏开发的语言是什么?
建议初学者学习主流的开发技术 主流开发技术有大量成熟的教程、很多可以交流的学习者、及时的学习反馈等;技术的内里基本都是相同的,学习主流技术的经验、知识可以更好更快地疏通学习新知识和技术。 因此,对C#或者C二选一进行学习较好。 Un…...
C语言刷题(7)(字符串旋转问题)——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容依旧是复习之前的知识点,那么,就是做一道小小的题目啦,下面,让我们进入C语言的世界吧 实现一个函数,可以左旋字符串中的k个字符。 例如: A…...
有趣且重要的JS知识合集(18)浏览器实现前端录音功能
1、主题描述 兼容多个浏览器下的前端录音功能,实现六大录音功能: 1、开始录音 2、暂停录音 3、继续录音 4、结束录音 5、播放录音 6、上传录音 2、示例功能 初始状态: 开始录音: 结束录音: 录音流程 …...
面试官:聊聊你知道的跨域解决方案
跨域是开发中经常会遇到的一个场景,也是面试中经常会讨论的一个问题。掌握常见的跨域解决方案及其背后的原理,不仅可以提高我们的开发效率,还能在面试中表现的更加游刃有余。 因此今天就来和大家从前端的角度来聊聊解决跨域常见的几种方式。…...
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 //调用者要先实现回调函数 //调用者再去调用函数框架 //所谓的回调是指 调用者去调用一个带有函数指针做参数的函数框架,函数框架反过来要调用调用者提供的回调函数 …...
Vue3(递归组件) + 原生Table 实现树结构复杂表格
一、递归组件 什么是递归,Javascript中经常能接触到递归函数。也就是函数自己调用自己。那对于组件来说也是一样的逻辑。平时工作中见得最多应该就是菜单组件,大部分系统里面的都是递归组件。文章中我做了按需引入的配置,所以看不到我引用组…...
ArrayList底层源码解析
Java源码系列:下方连接 http://t.csdn.cn/Nwzed 文章目录前言一、**ArrayList底层结构和源码分析**无参构造调用创建ArrayList集合无参构造总结:发文3个工作日后 up 会把总结放入前言部分,但也诚邀读者总结,可放入评论区有参构造…...
python:DIY字符画的程序使用说明.doc
目录开发环境要求运行方法具体的操作步骤如下:代码示例源码及运行程序下载地址开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统:Windows 7、Windows 10。 Python版本:Python 3.7.0。 开发工具:Python IDLE。 …...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
