JVM相关面试题

一、JVM是什么:

Java Virtual Machine,Java的运行环境(java二进制字节码的运行环境);一次编写、到处运行;自动管理内存,提供垃圾回收机制

JVM的组成部分、运行流程:

二、JVM的组成:

1.程序计数器:

程序计数器是线程私有的,内部保存的字节码行号,用于记录正在执行的字节码指令的地址

2.JAVA堆

Java堆是线程共享的区域:主要用来保存对象实例,数组等;当堆中没有内存空间可以分配给实例也无法再扩展时,则抛出OutOfMemoryError异常

Java8中Java堆由年轻代和老年代组成,其中年轻代被划分为三部分,分别是Eden区和两个大小严格相同的Survivor区,老年代主要保存生命周期长的对象,一般是一些老的对象

Java1.7中有一个永久代,存储的是类信息、静态变量、常量以及编译后的代码

Java1.8移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出

3.虚拟机栈:

Java Virtual Machine Stacks(JAVA虚拟机栈):

每个线程运行时所需要的内存,称为虚拟机栈,先进后出

每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存

每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

垃圾回收是否涉及栈内存:

垃圾回收主要指的就是堆内存,当栈帧弹出后,内存就会释放

栈内存分配越大越好吗:

未必,默认的栈内存通常为1024K,栈帧过大会导致线程数变少,机器总内存为512M,目前能活动的线程数则为512个,如果把栈内存改为2048K,那么能活动的栈帧就会减半

方法内的局部变量是否线程安全:

如果方法内的局部变量没有逃离方法的作用范围,它是线程安全的,如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

栈内存溢出的情况:

栈帧过多导致栈内存溢出、栈帧过大导致栈内存溢出

堆栈的区别是什么:

栈内存一般会用来存储局部变量和方法调用,但是堆内存是用来存储Java对象和数组的,堆会GC垃圾回收,而栈不会

栈内存是线程私有的,而堆内存是线程共有的

两者异常错误不同,但是如果栈内存或堆内存不足都会抛出异常:

栈空间不足:java.lang.StackOverFlowError

堆空间不足:java.lang.OutOfMemoryError

4.能不能解释一下方法区:

方法区(MethodArea)是各个线程共享的内存区域

主要存储类的信息、运行时常量池

虚拟器启动时创建,关闭时释放

如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError:MetaSpace

常量池 

可以看做是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型以及字面量等信息

运行时常量池:

常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址

5.直接内存:

直接内存并不属于JVM中的内存结构,不由JVM进行管理,是虚拟机的系统内存,常见于NIO操作时用于数据缓冲区,分配回收成本较高,但是读写性能较高,不受JVM内存回收管理

常规IO的数据拷贝流程:

NIO数据拷贝流程:

6.什么是类加载器,类加载器有哪些?

类加载器:

JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来

类加载器的分类:

(1).启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库

(2).扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类

(3).应用类加载器(AppClassLoader):用于加载classPath下的类

(4).自定义类加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则

双亲委派模型:

加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被加载,则子加载器尝试加载该类

JVM为什么要采用双亲委派机制:

(1).通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性

(2).为了安全,保证类库API不会被修改

7.类装载的执行过程:

类从加载到虚拟机中开始,直到卸载为止,它的生命周期包括了加载、验证、准备、解析、初始化、使用和卸载7个阶段,其中验证、准备和解析这三个部分统称为连接(linking)

(1).加载阶段:

通过类的全名,获取类的二进制数据流

解析类的二进制数据流为方法区内的数据结构

创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口

(2).验证阶段:

验证类是否符合JVM规范,安全性检测。

包括文件格式验证、元数据验证、字节码验证、符号引用验证。前三验证主要是格式检查,判断文件格式是否错误、语法是否错误以及字节码是否合格;最后一个验证主要是Class文件在其常量池会通过字符串记录自己将要使用的其他类或方法,检查他们是否存在

(3).准备阶段:

为类变量分配内存并设置类变量和初始值

static变量:分配空间在准备阶段完成,赋值在初始化阶段完成

static变量是final的基本类型,以及字符串常量,值已经确定,赋值在准备阶段完成

static变量时final的引用类型,那么赋值也会在初始化阶段完成

(4).解析阶段:

把类中的符号引用转换为直接引用

例如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法

(5).初始化阶段:

对类的静态变量,静态代码块执行初始化操作

如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类

如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行

(6).使用阶段:

JVM开始从入口方法开始执行用户的程序代码

调用静态类成员信息,使用new关键字为其创建对象实例

(7).卸载阶段:

当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象

8.对象什么时候可以被垃圾器回收:

如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收

要定位什么是垃圾,有两种方式,第一个是引用计数法,第二个是可达性分析算法

(1).引用计数法:

一个对象被引用了一次,在当前的对象头上递增一次引用次数,如果这个对象的引用次数为0,代表这个对象可回收

当对象间出现了循环引用的话,则引用计数法则会失效,会引发内存泄漏

(2).可达性分析算法:

现在的虚拟机采用的都是通过可达性分析算法来确定哪些内容是垃圾

哪些对象可以作为GC Root:

虚拟机栈(栈帧中的本地变量表)中引用的对象

方法区中类静态属性引用的对象

方法区中常量引用的对象

本地方法栈中JNI引用的对象

9.JVM垃圾回收算法有哪些?

(1).标记清除算法:

标记清除算法是将垃圾回收分为两个阶段,分别是标记和清除

a.根据可达性分析算法得出的垃圾进行标记

b.对这些标记为可回收的内容进行垃圾回收

(2).标记整理算法:

与标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低

(3).复制算法:

将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收,无碎片,内存使用率较低

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

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

相关文章

【蜂巢——方向,数学】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; int dx[6] {-1, -1, 0, 1, 1, 0}; int dy[6] {0, 1, 1, 0, -1, -1}; void cal(int d, int p, int q, int& x, int& y) {x p * dx[d];y p * dy[d];d (d 2) % 6;x q * dx[d];…

使用 Thermal Desktop 进行航天器热分析

介绍 将航天器保持在运行温度下的轨道上是一个具有挑战性的问题。航天器需要处理太空非常寒冷的背景温度&#xff0c;同时还要管理来自内部组件、地球反照率和太阳辐射的高热负荷。航天器在轨道上可以进行的各种轨道机动使解决这个问题变得更加复杂。 Thermal Desktop 是一款…

【ESP32】ESP-IDF开发 | WiFi开发 | AP模式 + 基站连接例程

1. 简介 前面一篇讲了WiFi的基站模式&#xff0c;演示了怎么编程连接AP&#xff0c;所以这一篇讲一讲AP模式&#xff0c;ESP32作AP&#xff0c;让其他的设备连接自己。 1.1 DHCP 这里需要补充一个知识点——DHCP服务器。当基站连接一个AP时&#xff0c;会被分配一个IP&#xf…

nss刷题3

[SWPUCTF 2022 新生赛]webdog1__start level1&#xff1a; 打开环境后什么也&#xff0c;没有&#xff0c;查看源码&#xff0c;看到第一关是MD5值&#xff0c;要get传参web&#xff0c;然后web的值的MD5和它原来值相等&#xff0c;0e开头的字符在php中都是0&#xff0c;传入…

如何使用C#与SQL Server数据库进行交互

一.创建数据库 用VS 创建数据库的步骤&#xff1a; 1.打开vs&#xff0c;创建一个新项目&#xff0c;分别在搜素框中选择C#、Windows、桌面&#xff0c;然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”&#xff0c;右键单击“数据连接”&#xff0…

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…

讲一下ZooKeeper的持久化机制?

大家好&#xff0c;我是锋哥。今天分享关于【讲一下ZooKeeper的持久化机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲一下ZooKeeper的持久化机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&…

【青蛙过河——思维】

题目 图解 代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int n, x; int h[N]; bool check(int mid) {for(int i 1; i mid - 1 < n; i)if(h[i mid - 1] - h[i - 1] < 2 * x) return false;return true; } int main() {cin >> …

港湾周评|万科的多重压力

《港湾商业观察》李镭 成立于1984年&#xff0c;经营了41年之久的行业模范生与明星房企&#xff0c;万科&#xff08;000002.SZ&#xff1b;02202.HK&#xff09;似乎从未遇到过这样的惊天骇浪。 一方面债务承压&#xff0c;2025年是否能妥善解决&#xff0c;又或是终将“暴雷…

搜维尔科技:Xsens人形机器人解决方案的优势

Xsens 致力于推动人形机器人技术的发展&#xff0c;塑造机器人与人类环境无缝融合的未来&#xff0c;通过创新精确和协作&#xff0c;协助生产和服务&#xff0c;改善人类生活和产业。 Xsens通过人形跟随捕捉详细的人体运动数据&#xff0c;使机器人能够学习类人的动作&#x…

LLM - 大模型 ScallingLaws 的 C=6ND 公式推导 教程(1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145185794 Scaling Laws (缩放法则) 是大模型领域中&#xff0c;用于描述 模型性能(Loss) 与 模型规模N、数据量D、计算资源C 之间关系的经验规律…

数组常见解决方案

数组常见解决方案 1.快慢指针(双指针) 慢指针记录当前位置 快指针寻找下一个符合条件的数 当符合条件时,此数将slow位置的数覆盖,slow指针指向下一个位置. 最后slow的位置就是符合条件的数组的长度. 80. 删除有序数组中的重复项 II - 力扣&#xff08;LeetCode&#xff09; …

智能学习平台系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装智能学习平台系统软件来发挥其高效地信息处理的作用&#…

前端项目搭建和基础配置

这个模块主要是介绍从零开始搭建项目的一些操作&#xff0c;包含一些前端常用的配置&#xff0c;这里只是一部分&#xff0c;会在后续的文章中逐步进行补充和完善 一、创建项目 在项目路径下使用以下命令生成前后端项目 npm create vite输入项目名称&#xff0c;框架选择Vue…

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法&#xff0c;它可作为DES算法的建议替代算法。RC2是一种分组加密算法&#xff0c;RC2的密钥长度可变&#xff0c;可以从8字节到128字节&#xff0c;安全性选择更加灵活。 开发调试上&#xff0c;有时候需要进行对…

Qt Desiogn生成的ui文件转化为h文件

1.找到这个工具 2.查找到ui文件以及要转化为的h文件的路径。 3.在1中的工具输入uic /xx/xxx.ui -o /xx/xxx.h即可得到结果。

多元线性回归分析

介绍: 回归分析是一种强大的统计方法&#xff0c;用于研究变量之间的关系&#xff0c;特别是一个或多个自变量与一个因变量之间的定量关系。 总结就是研究X和Y之间的相关性的分析 First:相关性: 相关性不代表因果性, Eg:统计数据表明:游泳死亡人数越高&#xff0c;雪糕卖得…

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…

彻底讲清楚 单体架构、集群架构、分布式架构及扩展架构

目录 什么是系统架构 单体架构 介绍 示例图 优点 缺点 集群架构 介绍 示意图 优点 缺点 分布式架构 示意图 优点 缺点 生态扩展 介绍 示意图 优点 缺点 扩展&#xff1a;分布式服务解析 纵切拆服务 全链路追踪能力 循环依赖 全链路日志&#xff08;En…