面试 JVM 八股文十问十答第三期

news/2024/4/28 2:05:56/文章来源:https://blog.csdn.net/qq_67358181/article/details/137001274

面试 JVM 八股文十问十答第三期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

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

  • 类加载器(ClassLoader):负责将字节码文件加载到内存中,并生成对应的Class对象。
  • 运行时数据区(Runtime Data Area):包括方法区、堆、虚拟机栈、本地方法栈和程序计数器等。
  • 执行引擎(Execution Engine):负责执行字节码指令。
  • 垃圾回收器(Garbage Collector):负责自动回收不再使用的对象,释放内存空间。
  • JIT编译器(Just-In-Time Compiler):将热点代码(频繁执行的代码)编译成本地机器码,提高执行效率。
  • Java Native Interface(JNI):提供了与本地语言(如C、C++)交互的接口。
  • 本地方法库(Native Method Libraries):包含了与操作系统相关的一些本地方法的实现。

2)说一下 JVM 运行时数据区

  • 方法区(Method Area):用于存储类的结构信息、常量池、静态变量等。
  • 堆(Heap):用于存储对象实例,是JVM管理的最大一块内存区域。
  • 虚拟机栈(VM Stack):用于存储方法调用的局部变量、方法参数、返回值等。
  • 本地方法栈(Native Method Stack):与虚拟机栈类似,但是为本地方法服务。
  • 程序计数器(Program Counter):用于记录当前线程执行的字节码指令位置。
  • 运行时常量池(Runtime Constant Pool):存放编译期生成的各种字面量和符号引用。

3)深拷贝和浅拷贝

  • 深拷贝(Deep Copy):在拷贝对象时,不仅复制对象本身,还会递归复制对象引用的所有对象,使得拷贝后的对象与原对象完全独立。
  • 浅拷贝(Shallow Copy):在拷贝对象时,只复制对象本身,而不会复制对象引用的其他对象,拷贝后的对象与原对象共享引用对象。

深拷贝和浅拷贝的区别在于是否复制对象引用的其他对象。深拷贝可以避免对象之间的相互影响,每个对象都拥有独立的数据副本,但是拷贝过程较为复杂和耗时。而浅拷贝则只是简单地复制对象本身,对象之间仍然共享引用对象,容易导致对象之间的数据冲突。

在Java中,可以通过实现Cloneable接口并重写clone()方法来实现对象的浅拷贝,或者使用序列化和反序列化来实现对象的深拷贝。另外,也可以通过手动复制对象的属性来实现深拷贝。

4)说一下堆栈的区别?

  • 堆(Heap)是一块用于存储对象实例的内存区域,由JVM动态分配和管理。堆的大小可以通过启动参数进行调整。堆中的对象可以被所有线程访问,是线程共享的。
  • 栈(Stack)是一块用于存储方法调用的局部变量、方法参数、返回值等的内存区域。每个线程都有自己的栈,栈的大小是固定的。栈中的数据只能被所属线程访问,是线程私有的。

堆和栈的区别主要体现在以下几个方面:

  • 内存管理:堆由JVM动态分配和回收,栈由编译器自动分配和回收。
  • 大小和生命周期:堆的大小可以通过启动参数调整,生命周期较长;栈的大小是固定的,生命周期与线程相对应,方法调用结束后,栈中的数据会被自动释放。
  • 对象存储:堆存储对象实例,对象可以被多个线程访问;栈存储局部变量等方法调用相关的数据,只能被所属线程访问。
  • 内存分配方式:堆采用动态分配,对象的创建和销毁由JVM负责;栈采用静态分配,方法的调用和返回由编译器控制。

5)队列和栈是什么?有什么区别?

  • 队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构,类似于排队的概念。新元素被插入到队列的尾部,而从队列中取出元素时,总是从队列的头部开始取出。
  • 栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构,类似于一摞盘子。新元素被压入栈的顶部,而从栈中取出元素时,总是从栈的顶部开始取出。

区别:

  • 插入和删除方式:队列采用先进先出的方式,插入元素在队尾,删除元素在队头;栈采用后进先出的方式,插入和删除元素都在栈顶。
  • 元素访问顺序:队列按照插入顺序访问元素,先插入的元素先被访问;栈按照插入顺序的逆序访问元素,后插入的元素先被访问。
  • 应用场景:队列常用于实现消息队列、任务调度等场景,栈常用于实现函数调用、表达式求值等场景。
  • 数据结构:队列可以用数组或链表实现,栈也可以用数组或链表实现。

6)对象的创建

在Java中,对象的创建主要有以下几个步骤:

  • 分配内存:根据对象的类型,分配一块连续的内存空间。
  • 初始化:对分配的内存空间进行初始化,设置对象的初始值。
  • 执行构造函数:调用对象的构造函数,进行进一步的初始化操作。
  • 返回对象引用:将对象的引用返回给调用者,以便后续对对象的操作。

在创建对象时,可以使用关键字new来实例化一个对象,例如ClassName obj = new ClassName()。在实例化对象时,会调用对象的构造函数进行初始化。构造函数可以有多个重载形式,用于满足不同的对象初始化需求。对象的创建和初始化是在堆中进行的,而对象的引用则存储在栈中。

7)为对象分配内存

在Java中,对象的内存分配是由JVM自动完成的。当使用关键字new创建一个对象时,JVM会在堆中分配一块连续的内存空间来存储对象的数据。JVM会根据对象的类型和大小来确定分配的内存大小,并进行对象的初始化。

8)处理并发安全问题

并发安全问题是指在多线程环境下,多个线程对共享资源进行读写操作时可能出现的数据不一致或不正确的情况。为了处理并发安全问题,可以采取以下几种方式:

  • 使用同步机制:通过使用synchronized关键字或ReentrantLock等锁机制来保证同一时间只有一个线程访问共享资源,从而避免数据竞争和并发冲突。
  • 使用原子操作类:Java提供了一些原子操作类,如AtomicIntegerAtomicLong等,它们提供了线程安全的原子操作,可以避免多线程并发操作时的数据不一致问题。
  • 使用线程安全的集合类:Java提供了一些线程安全的集合类,如ConcurrentHashMapCopyOnWriteArrayList等,它们在多线程环境下可以安全地进行读写操作。

9)对象的访问定位

在Java中,对象的访问定位是通过对象的引用来实现的。当创建一个对象时,会在堆中分配内存,并返回一个指向该对象的引用。通过引用,可以访问对象的属性和方法。引用可以存储在栈中,也可以存储在堆中的其他对象中。

10)内存溢出异常

内存溢出异常(OutOfMemoryError)是指在程序运行过程中,申请的内存超出了JVM所能分配的内存大小,导致无法继续分配内存空间的异常。内存溢出异常通常发生在以下情况:

  • 创建过多的对象:如果程序中频繁创建大量的对象,并且没有及时释放,就会导致内存溢出。
  • 递归调用导致栈溢出:如果程序中出现无限递归调用,每次递归都会占用一部分栈空间,当栈空间耗尽时,就会导致栈溢出。
  • 内存泄漏:如果程序中存在内存泄漏的情况,即对象不再使用但没有被正确释放,就会导致内存溢出。

处理内存溢出异常的方法包括:

  • 检查代码中的对象创建和销毁,确保及时释放不再使用的对象。
  • 增加JVM的堆内存大小,可以通过调整启动参数来增加堆内存大小。
  • 优化程序逻辑,减少对象的创建和占用的内存空间。
  • 使用内存分析工具,定位内存泄漏的问题,并进行修复。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 900+ Star,1.5W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

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

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

相关文章

关于深度学习的 PyTorch 项目如何上手分析?从什么地方切入?

文章目录 PyTorch 项目分析1.背景2.分析流程 PyTorch 项目分析 1.背景 当我们拿到一个 PyTorch 的深度学习项目时,应该怎么入手?怎么去查看代码? 2.分析流程 首先阅读对应项目的 README.md 文件。通过阅读 README.md ,一般可以…

【Redis面试题】Redis 的大 Key 对持久化有什么影响?

目录 大 Key 对 AOF 日志的影响大 Key 对 AOF 重写和 RDB 的影响总结 Redis 的持久化方式有两种:AOF 日志和 RDB 快照。 所以接下来,针对这两种持久化方式具体分析分析。 大 Key 对 AOF 日志的影响 先说说 AOF 日志三种写回磁盘的策略 Redis 提供了 3 …

记录在项目中引用本地的npm包

1、先把需要的包下载下来,以Photo Sphere Viewer 为引用的npm包、项目以shpereRepo为例子 git clone https://github.com/mistic100/Photo-Sphere-Viewer2、拉下代码后修改之后执行 ./build.sh build.sh #!/usr/bin/env bashyarn run build targetDir"../sh…

HarmonyOS 应用开发之UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他UIAbility,也可以是其他应用的UIAbility(例如启动三方支付UIAbility)。 本文将从如下场景…

Etcd 基本入门

1:什么是 Etcd ? Etcd 是 CoreOS 团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,Etcd基于 Go 语言实现。 名字由来,它源于两个方面,…

面试笔记——MyBatis(执行流程、延迟加载和缓存)

MyBatis 是一个持久层框架,用于简化 Java 应用程序与数据库之间的交互过程。具体而言,它提供了一种将数据库操作映射到 Java 方法的方式,通过 XML 文件或注解配置 SQL 语句与 Java 方法的映射关系。使用 MyBatis,开发人员可以通过…

YOLOV8逐步分解(2)_DetectionTrainer类初始化过程

接上篇文章yolov8逐步分解(1)--默认参数&超参配置文件加载继续讲解。 1. 默认配置文件加载完成后,创建对象trainer时,需要从默认配置中获取类DetectionTrainer初始化所需的参数args,如下所示 def train(cfgDEFAULT_CFG, use_pythonFalse…

Docker-Container

Docker ①什么是容器②为什么需要容器③容器的生命周期容器 OOM容器异常退出容器暂停 ④容器命令清单总览docker createdocker rundocker psdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker container insp…

Elasticsearch从入门到精通-07ES底层原理学习

Elasticsearch从入门到精通-07ES底层原理和高级功能 👏作者简介:大家好,我是程序员行走的鱼 📖 本篇主要介绍和大家一块学习一下ES底层原理包括集群原理、路由原理、分配控制、分配原理、文档分析原理、文档并发安全原理以及一些高…

第十四届蓝桥杯JavaA组省赛真题 - 特殊日期

解题思路&#xff1a; 暴力秒了 public class Main {public static void main(String[] args) {int cnt 0;for (int i 1900; i < 9999; i) {for (int j 1; j < 12; j) {for (int k 1; k < days(i, j); k) {if (sum(i) sum(j) sum(k)) cnt;}}}System.out.print…

算法笔记~—位运算

目录 常见位运算&#xff1a; 1、基础位运算 2、对于一个数n。确定、修改这个数n二进制x位。 3、提取&#xff08;确定&#xff09;一个数n最右侧的1&#xff08;bit&#xff09;与干掉最右侧的1&#xff08;bit&#xff09; 4、异或运算律 5、位运算的优先级&#xff1a…

Qt扫盲-QAssisant 集成其他qch帮助文档

QAssisant 集成其他qch帮助文档 一、概述二、Cmake qch例子1. 下载 Cmake.qch2. 添加qch1. 直接放置于Qt 帮助的目录下2. 在 QAssisant中添加 一、概述 QAssisant是一个很好的帮助文档&#xff0c;他提供了供我们在外部添加新的 qch帮助文档的功能接口&#xff0c;一般有两中添…

百度智能云千帆,产业创新新引擎

本文整理自 3 月 21 日百度副总裁谢广军的主题演讲《百度智能云千帆&#xff0c;产业创新新引擎》。 各位领导、来宾、媒体朋友们&#xff0c;大家上午好。很高兴今天在石景山首钢园&#xff0c;和大家一起沟通和探讨大模型的发展趋势&#xff0c;以及百度最近一段时间的思考和…

为什么Python不适合写游戏?

知乎上有热门个问题&#xff1a;Python 能写游戏吗&#xff1f;有没有什么开源项目&#xff1f; Python可以开发游戏&#xff0c;但不是好的选择 Python作为脚本语言&#xff0c;一般很少用来开发游戏&#xff0c;但也有不少大型游戏有Python的身影&#xff0c;比如&#xff1…

sheng的学习笔记-AI-人脸识别

目录:sheng的学习笔记-AI目录-CSDN博客 需要学习卷机神经网络等知识&#xff0c;见ai目录 目录 基础知识&#xff1a; 人脸验证&#xff08;face verification&#xff09; 人脸识别&#xff08;face recognition&#xff09; One-Shot学习&#xff08;One-shot learning&…

PTA-练习8

目录 实验5-3 使用函数求Fibonacci数 实验5-4 输出每个月的天数 实验5-9 使用函数求余弦函数的近似值 实验5-11 空心的数字金字塔 实验6-6 使用函数验证哥德巴赫猜想 实验6-7 使用函数输出一个整数的逆序数 实验6-8 使用函数输出指定范围内的完数 实验8-1-7 数组循环右…

Transformer的前世今生 day11(Transformer的流程)

Transformer的流程 在机器翻译任务中&#xff0c;翻译第一个词&#xff0c;Transformer的流程为&#xff1a; 先将要翻译的句子&#xff0c;一个词一个词的转换为词向量送入编码器层&#xff0c;得到优化过的词向量以及K、V&#xff0c;将K、V送入解码器层&#xff0c;并跟解码…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

android studio忽略文件

右键文件&#xff0c;然后忽略&#xff0c;就不会出现在commit里面了 然后提交忽略文件即可

Vue3 + Vite + TS + Element-Plus + Pinia项目(5)对axios进行封装

1、在src文件夹下新建config文件夹后&#xff0c;新建baseURL.ts文件&#xff0c;用来配置http主链接 2、在src文件夹下新建http文件夹后&#xff0c;新建request.ts文件&#xff0c;内容如下 import axios from "axios" import { ElMessage } from element-plus im…