面试题005-Java-JVM(上)

面试题005-Java-JVM(上)

目录

  • 面试题005-Java-JVM(上)
    • 题目自测
    • 题目答案
      • 1. JVM由哪几部分组成?
      • 2. 运行时数据区中包含哪些区域?
      • 3. 栈和堆中分别存放什么数据?
      • 4. 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) ?
      • 5. 堆空间的基本结构了解吗?什么情况下对象会进入老年代?
      • 6. 大对象放在哪个内存区域?
      • 7. Java对象的创建过程?
    • 参考资料

题目自测

  • 1. JVM由哪几部分组成?
  • 2. 运行时数据区中包含哪些区域?
  • 3. 栈和堆中分别存放什么数据?
  • 4. 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) ?
  • 5. 堆空间的基本结构了解吗?什么情况下对象会进入老年代?
  • 6. 大对象放在哪个内存区域?
  • 7. Java对象的创建过程?

题目答案

1. JVM由哪几部分组成?

答:JVM是一个可以执行字节码(.class)文件的虚拟计算机,同时提供了内存管理,垃圾回收等机制。它包含了以下几个主要部分。

  • 类加载子系统:负责将字节码文件(.class)加载到JVM。
  • 运行时数据区:是JVM在执行期间使用的内存区域。
  • 执行引擎:负责解释或编译字节码为机器码,供处理器执行。
  • 本地库接口:提供了一组调用操作系统或其他语言编写的本地库的API。

2. 运行时数据区中包含哪些区域?

答:运行时数据区是JVM在执行Java程序时为其分配的内存区域。

  • 程序计数器:是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。如果线程正在执行本地方法,这这个计数器的值是未定义的。
  • Java虚拟机栈:每个线程在创建的时候都会创建一个虚拟机栈,用于存储线程的局部变量表、操作数帧、动态链接、方法出口信息等。Java虚拟机栈中包含多个栈帧,每个方法被调用到执行完成的过程,都对应着虚拟机中一个栈帧的入栈到出栈的过程。
  • 本地方法栈:是JVM运行Native方法准备的空间,它与Java虚拟机栈实现的功能类似,它是描述本地方法运行过程的内存模型。
  • 堆:用于存放几乎所有的对象实例和数组,是垃圾回收器主要工作的区域。
  • 方法区:用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等。JDK1.8之前,被实现为永久代。JDK1.8开始永久代被原空间取代。元空间使用的是本地内存而非堆内存。
    Java虚拟机运行时数据区

3. 栈和堆中分别存放什么数据?

答:栈(Java虚拟机栈)中存放的数据:

  • 局部变量表:主要用于存储方法参数,方法内的局部变量,数据类型包括基本数据类型和对象的引用。
  • 操作数栈:用于临时存储操作指令和方法执行过程中中间结果。
  • 动态链接:指向方法所属类的常量池的引用,用于解析方法中的符号引用。
  • 方法返回地址:存储方法调用后执行的下一条指令地址。
    堆中存放的数据:
  • 对象实例:在程序中通过new关键字创建的对象实例,包括对象的属性和方法。
  • 数组:所有类型的数组,包括基本类型数组和对象数组。

4. 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) ?

答:将永久代替换为元空间主要是为了解决永久代的一些固有问题和限制,提高JVM的性能和灵活性。

  • 提高内存管理的灵活性和效率:永久代的内存大小是在JVM启动时就已经设定好的,不能动态调整。元空间使用的是本地内存而不是Java堆内存,它的大小可以根据需要动态调整。
  • 解决类卸载和垃圾回收问题:永久代的GC行为较为复杂且不可预测,并且回收效率偏低。
  • 提供更好的性能和稳定性:使用元空间使得JVM内存管理更加统一和一致,因为元空间和其他内存区域一样,都是使用本地内存进行管理。这样可以简化内存管理策略,提升整体性能和稳定性。
  • 简化JVM的内存管理

5. 堆空间的基本结构了解吗?什么情况下对象会进入老年代?

答:堆空间的基本结构主要由新生代、老年代和永久代组成。JDK8以后永久代被元空间取代,使用本地内存来存储。

  • 新生代:新生代进步一细分为Eden区和两个幸存者区(Survivor 0 和 Surivivor 1)
    • Eden区:新创建的对象首先在Eden区分配内存。
    • 幸存者区(S0, S1):用于存放在新生代垃圾回收时存活下来的对象。每次Minor GC后,存活的对象会在这两个区来回复制。
  • 老年代:经过多次Minor GC后仍然存活的对象。老年代进行垃圾回收(Major GC 或 Full GC)的频率较低。
  • 永久代/元空间:用于存储类的元数据,包括类的定义、常量、静态变量、即时编译后的代码等。

对象进行老年代的情况:

  • 年龄阈值达到:每个对象在新生代分配内存时都有一个年龄,每次Minor GC后年龄都会加1。当年龄达到一定阈值(默认是15)后,对象会被提升到老年代。
  • 大对象:如果对象太大,超过了JVM设定的阈值,对象会直接在老年代分配空间。
  • Survivor区空间不足:如果在进行Minor GC时,幸存者区没有足够的空间来容纳所有存活的对象,这些对象会被
  • 动态对象年龄判定:如果Survivor空间中相同年龄的所有对象大小超过了Survivor空间的一半,那么年龄大于或等于该年龄的对象可以直接进入老年代。
// 动态年龄计算代码
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {//survivor_capacity是survivor空间的大小
size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);//TargetSurvivorRatio 为50
size_t total = 0;
uint age = 1;
while (age < table_size) {
total += sizes[age];//sizes数组是每个年龄段对象大小
if (total > desired_survivor_size) break;
age++;
}
uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;...
}

6. 大对象放在哪个内存区域?

答:大对象(非常大的数组和字符串)通常会直接分配在老年代内存区域。这是为了避免新生代进行频繁的垃圾回收时,大对象频繁地在Eden区和Survivor区之间复制,从而提高垃圾收集效率。
配置大对象直接进入老年代的阈值:

# 将大于1MB的对象直接分配在老年代
java -XX:PretenureSizeThreshold=1m -jar your-application.jar

7. Java对象的创建过程?

答:

  1. 类加载检查
    • 如果类没有被加载、连接和初始化,JVM会先进行类加载。这包括以下步骤:
      • 加载:通过类加载器读取类文件,并将类的字节码加载到内存中。
      • 连接:包括验证、准备和解析三个阶段。验证类文件的正确性,准备类的静态变量并分配内存,解析符号引用为直接引用。
      • 初始化:执行类的静态初始化块和静态变量的初始化。
  2. 内存分配
    • JVM在堆中为新对象分配内存。分配的内存大小由对象的结构决定,包括对象头和实例数据。
    • JVM有两种主要的内存分配方式:
      • 指针碰撞(Bump-the-pointer):如果堆内存是规整的,分配指针只需向空闲内存区域移动指定大小的距离。
      • 空闲列表(Free List):如果堆内存是非规整的,JVM需要维护一个空闲列表,分配内存时从空闲列表中找到合适的块。
  3. 初始化零值
    • JVM会将对象的所有实例变量初始化为默认值。例如,数值类型变量会被初始化为0,布尔类型变量初始化为false,引用类型变量初始化为null。
  4. 设置对象头
    • 在对象的内存空间中设置对象头信息,这包括对象的哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等。
  5. 构造方法初始化
    • 调用对象的构造函数来完成对象的初始化工作。这包括执行实例变量的显式初始化操作以及构造方法体中的代码。具体步骤如下:
      • 执行类的实例初始化块。
      • 按照继承层次从上到下执行父类的构造方法。
      • 初始化实例变量为显式指定的值。
      • 执行类的构造方法的主体部分。
/*** 创建对象的示例代码*/
public class MyClass {private int value;public MyClass(int value) {this.value = value;}public static void main(String[] args) {MyClass obj = new MyClass(10);}
}
  • 上面代码示例的执行过程如下:
    • 类加载:JVM检查 MyClass 是否已加载。如果未加载,则加载 MyClass 类。
    • 内存分配:在堆中为 MyClass 的新实例分配内存。
    • 内存初始化:将分配的内存初始化为默认值。
    • 设置对象头:在对象头中设置元数据。
    • 构造方法初始化:执行 MyClass 的构造方法,初始化实例变量 value 为 10。

参考资料

  • JavaGuide
  • 牛客网-Java面试宝典
  • Java虚拟机底层原理总结
  • ChatGPT

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

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

相关文章

千万慎投!自引率高达93%!这16本On hold正处于高危状态,无法检索,剔除岌岌可危中!近四年镇压期刊“出狱”情况一览

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • CCF推荐&#xff0c;4.5-5.0&#xff08;2天见刊&#xff09; • 生物医学制药类&#xff08;2天逢投必中&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09…

20240712 每日AI必读资讯

&#x1f4f0;人工智能现状报告最新重要发现&#xff01;&#xff01; - 国外软件开发平台 Retool 日前调查约 750 位技术人员发现&#xff0c;AI 的采用率并没有飙升&#xff0c;但工作岗位的替代危机正在上演。 - AI 的采用率真的在飙升吗&#xff1f;真实现状&#xff1a;…

缓冲器的重要性,谈谈PostgreSQL

目录 一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器 一、PostgreSQL是什么 PostgreSQL是一种高级的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加…

sqli-labs2

sqli-labs2 1.按照路径http://localhost/sqli-labs/sqli-labs-master/Less-2/进入 2.确认注入类型----数字型 Payload&#xff1a;?id1 and 11-- 3. 判断注入点&#xff1a;2&#xff0c;3 Payload&#xff1a;id-1 union select 1,2,3 -- 4.根据注入点查询数据库名----sec…

防火墙基础实验

首先交换机配置 [LSW7]undo info-center enable [LSW7]vlan batch 2 3 [LSW7]int g0/0/2 [LSW7-GigabitEthernet0/0/2]port link-type access [LSW7-GigabitEthernet0/0/2]port default vlan 2 [LSW7-GigabitEthernet0/0/2]int g0/0/3 [LSW7-GigabitEthernet0/0/3]port link-…

码云远程仓库, 回滚到指定版本号

1. 打开项目路径, 右击Git Bash Here 2. 查找历史版本 git reflog 3. 回退到指定版本 git reset --hard 版本号 4. 强制推送到远程 git push -f

#VERDI# 关于如何查看FSM状态机的方法

关于Verdi中查看状态机的问题,想必大家都duniang 一大把资料可以看,今天,主要在前人讲解的基础之上,这里添加一些自己的心得体会。为什么呢? 说来惭愧,自己工作几个年头了,但是对于Verdi中查查看状态机,还是心里有一些抵触。 今天,花点时间整理一下分享大家,如有不…

windows上修改redis端口号

概况 redis是一个开源的内存数据结构存储系统&#xff0c;常用做数据库、缓存和消息代理。默认的端口号为6379 更改redis端口号步骤如下 先停止redis服务 redis-cli shutdowm 打开redis配置文件 在redis安装目录下&#xff0c;即redis.windows.conf文件。 port 6396 然后…

轴心轨迹的绘制(包含降噪前处理,MATLAB)

由于旋转机械振动波形的噪声干扰大&#xff0c;直接对振动数据特征提取和选择的故障诊断方法&#xff0c;其精度容易受到噪声影响。当前&#xff0c;基于图像的旋转机械故障诊断技术已经得到飞速的发展。针对旋转机械的故障诊断问题&#xff0c;传统方法趋向于从振动数据中提取…

240707-Sphinx配置Pydata-Sphinx-Theme

Step A. 最终效果 Step B. 为什么选择Pydata-Sphinx-Theme主题 Gallery of sites using this theme — PyData Theme 0.15.4 documentation Step 1. 创建并激活Conda环境 conda create -n rtd_pydata python3.10 conda activate rtd_pydataStep 2. 安装默认的工具包 pip in…

记录文字视差背景学习

效果图 文字背景会随鼠标上下移动变成红色或透明 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

SpringCloud架构师面试

一、微服务是什么 1、基本概念 微服务是一种架构风格&#xff08;区别于单体架构、垂直架构、分布式架构、SOA架构&#xff09;&#xff0c;应用程序被划分为更小的、流程驱动的服务。 2、微服务的特征 轻量化&#xff1a;将复杂的系统或者服务进行纵向拆分&#xff0c;每个…

Android数据库基础

目录 1、安卓数据存储方式 2、数据库事务 数据库事务的特性(ACID) 事务的隔离级别 事务总结 3、ContetProvider 作用 ​编辑 统一资源标识符URI ​编辑 MIME类型 ContentProvider主要方法 4、ContentResolver 作用 主要方法 使用案例 辅助工具类 ContentUris Uri…

BPMN.js学习

查看流程图 processView: {title: ,open: false,index: undefined,xmlData:"", },<el-table-column label"模型名称" align"center" :show-overflow-tooltip"true"><template slot-scope"scope"><el-button…

抖音短视频矩阵系统源码开发与部署全解析

1. 需求分析与功能规划 在着手开发短视频矩阵源码之初&#xff0c;首要任务是界定项目需求。这包含对视频上传、编辑、分享、评论及点赞等功能的实现预期。同时&#xff0c;需深入理解目标用户群体的具体需求和使用习惯&#xff0c;以确保产品能够满足市场需求。 2. 技术选型…

游戏如何应对黑灰产工作室

游戏黑灰产工作室&#xff0c;是指以非法渠道、非法手段通过游戏进行牟利的团伙。使用脚本、外挂是黑灰产工作室的显著特征&#xff0c;其常见的牟利方式有&#xff1a;打金工作室、资源囤积号、初始号、自抽号、代练工作室以及营销欺诈等。 ▲ 常见的游戏黑灰产工作室牟利路径…

视频太大怎么压缩变小?这几种压缩方法值得收藏!

视频太大怎么压缩变小&#xff1f;在数字化浪潮汹涌的时代&#xff0c;处理大型视频文件已不再仅仅是存储空间的挑战&#xff0c;我们身处于数据洪流之中&#xff0c;数据的安全与隐私的保护已然成为了我们不得不面对的重大议题&#xff0c;特别是随着视频内容的井喷式增长及其…

Qt学生管理系统(付源码)

Qt学生管理系统 一、前言1.1 项目介绍1.2 项目目标 2、需求说明2.1 功能性说明2.2 非功能性说明 三、UX设计3.1 登录界面3.2 学生数据展示3.3 信息插入和更新 三、架构说明3.1 客户端结构如下3.2 数据流程图3.2.1 数据管理3.2.2 管理员登录 四、 设计说明3.1 数据库设计3.2 结构…

智能家居开发新进展:乐鑫 ESP-ZeroCode 与亚马逊 ACK for Matter 实现集成

日前&#xff0c;乐鑫 ESP-ZeroCode 与亚马逊 Alexa Connect Kit (ACK) for Matter 实现了集成。这对智能家居设备制造商来说是一项重大进展。开发人员无需编写固件或开发移动应用程序&#xff0c;即可轻松设计符合 Matter 标准的产品。不仅如此&#xff0c;开发者还可以在短短…

算法模块导学

算法分析版本迭代流程图设计算法实践 练就扎实的基本功&#xff0c;可量化&#xff0c;可评估的&#xff0c;不是停留在大脑中的感觉。 1、算法&测开之缘 我们学习算法的目标是为了测试服务的&#xff0c;所以我们要了解测开最终要具备什么样的能力。 测开需要具备的能力…