JVM面试题之内存区域、类加载篇

文章目录

  • 引言
  • JVM是什么?
  • 1. JVM内存划分
  • 2. 对象如何在JVM中创建
    • 2.1 内存分配
    • 2.2 创建对象步骤
  • 3. JVM类加载流程
    • 3.1 双亲委派
  • 总结

引言

Java开发人员在面试中基本都会被问到关于JVM的问题。想要成为高级的开发人员,了解和学习Java运行的原理和JVM是必不可少的,在解决疑难杂症上会很有帮助。本文会介绍在面试和实际工作中需要了解的主要的知识点。


JVM是什么?

JVM(Java虚拟机)。JVM的主要作用是在各种硬件平台上解释并执行Java字节码(.class文件),从而使得Java程序能够在不同的操作系统和架构上无需重新编译即可运行。这是Java“一次编写,到处运行”的核心所在。


1. JVM内存划分

在这里插入图片描述
JVM主要被划分成​ 堆、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器五个部分,主要功能如下:

Heap(堆):
​ 堆用于分配对象的实例以及数组的内存,线程共享,用来存放对象实例,也是垃圾回收(GC)的主要区域。
一般来说堆内又分为新生代和老年代,新生代又分为:Eden区和Surviver1和Surviver2区;

方法区:
​ 方法区也可以称之为永久区,它主要储存的是已经被java虚拟机加载的类信息、常量、静态变量;Jdk1.8以后取消了方法区这个概念,称之为元空间(MetaSpace);

虚拟机栈:
​ 虚拟机栈主要用于存储栈帧 ,线程私有,每一个方法在执行的时候都会创建一个栈帧,栈帧中用来存放(局部变量表、操作数栈 、动态链接 、返回地址

本地方法栈:
​ 本地方法栈和虚拟机栈类似,不同的是虚拟机栈服务的是Java方法,而本地方法栈服务的是Native方法。

PC程序计数器:
​ PC,指的是存放下一条指令的位置的一个指针。它是一块较小的内存空间,且是线程私有的。由于线程的切换,CPU在执行的过程中,需要记住原线程的下一条指令的位置,所以每一个线程都需要有自己的PC。

2. 对象如何在JVM中创建

2.1 内存分配

在这里插入图片描述

  • 对象优先分配在Eden区,如果Eden区没有足够的空间进行分配时,虚拟机执行一次MinorGC。而那些无需回收的存活对象,将会进到Survivor 的 From 区(From 区内存不足时,直接进入 Old 区)。
  • 大对象直接进入老年代(需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄(Age Count)计数器,如果对象经过了1次Minor
    GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,直到达到阀值(默认15次),对象进入老年区。

2.2 创建对象步骤

创建对象主要分为5个步骤类加载检查、分配内存、初始化零值、设置对象头、执行init方法

①类加载检查:
​ 虚拟机遇到 new 指令时,⾸先去检查是否能在常量池中定位到这个类的符号引⽤,并且检查这个符号引⽤代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执⾏相应的类加载过程。

②分配内存:
​ 在类加载检查通过后,接下来虚拟机将为新⽣对象分配内存。

③初始化零值:
​ 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值,这⼀步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使⽤,程序能访问到这些字段的数据类型所对应的零值。

④设置对象头:
​ 初始化零值完成之后,虚拟机要对对象进⾏必要的设置,例如这个对象是那个类的实例、如何才能找到类的元数据信息、对象的哈希吗、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 另外,根据虚拟机当前运⾏状态的不同,如是否启⽤偏向锁等,对象头会有不同的设置⽅式。

⑤执⾏ init ⽅法:
​ 从虚拟机的视⻆来看,⼀个新的对象已经产⽣了,但从Java 程序的视⻆来看, ⽅法还没有执⾏,所有的字段都还为零。所以⼀般来说(除循环依赖),执⾏ new 指令之后会接着执⾏⽅法,这样⼀个真正可⽤的对象才算产⽣出来。

3. JVM类加载流程

在这里插入图片描述
过程:加载、验证、准备、解析、初始化

加载(Loading):
加载是指读取类的.class文件,将其转化为二进制数据流,再将这些数据转化成方法区中的运行时数据结构。

验证(Verification):
验证阶段确保字节码文件符合JVM规范,防止加载含有错误的类,保障类的正确性和安全性。

准备(Preparation):
准备阶段为类的静态变量分配内存并在方法区中设置默认初始值,但并不执行任何初始化代码。

解析(Resolution):
解析阶段将常量池中的符号引用转换为直接引用,即将类、字段、方法等符号引用解析为具体内存地址。

初始化(Initialization):
初始化是最具活力的一个阶段,它负责执行类构造器 () 方法,用于初始化类变量和其他静态成员,此时类才真正具备对外提供服务的能力。

3.1 双亲委派

JVM的双亲委派模型是指每当一个类加载器需要加载类的时候,它会先委托它的父加载器去尝试加载这个类,只有在父加载器无法加载这个类的情况下,才会由原始的类加载器尝试去加载。这个模型的主要目的是为了保证类的独立性和防止类的重复加载。这里的双亲不能以父母来理解,而是以自下而上的委托父类加载器来理解。

在这里插入图片描述
破坏双亲委派机制:
可以⾃⼰定义⼀个类加载器,重写loadClass方法;loadClass方法主要进行类加载的方法,默认的双亲委派机制就实现在这个方法中。

总结

JVM内存划分及各区域的作用都需要了解,类加载和双亲委派面试常客,也建议学习加了解,学习里面的设计思想。后续会介绍JVM垃圾回收相关的知识。

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

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

相关文章

数据结构——二叉树性质

性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>1)。 这个性质很好记忆,观察一下图6-5-5。 第一层是根结点,只有一个,所以2^(1-1)2^01。 第二层有两个,2^(2-1)22。 第三层有四个,2^(3-1)2^24。 第四层有八个&am…

【年报文本分析】Python+Selium获取互动易平台投资者提问与上市公司回应文本数据

目录 序言excel文件准备全部代码 序言 互动易平台链接:https://irm.cninfo.com.cn/views/interactiveAnswer 需要提前下载好三个库,都可以用pip install轻松下载,稍微麻烦点儿的是需要去下载个对应版本的chromedriver.exe驱动,放…

路由表与IP数据报的转发

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、相关知识 1、路由类型 路由表中有3类路由:直连路由、静态路由、动态路由 直连路由:一般指去往路由器接口直接连接网络的…

mysql中You can’t specify target table for update in FROM clause错误

mysql中You can’t specify target table for update in FROM clause错误 You cannot update a table and select directly from the same table in a subquery. mysql官网中有这句话,我们不能在一个语句中先在子查询中从某张表查出一些值,再update这张表…

【ffmpeg命令入门】视频剪切,倍速与倒放

文章目录 前言1. 视频剪切2. 视频倍速公式说明例子 3. 视频倒放总结 前言 在视频编辑中,剪切、倍速和倒放是常见的操作,能够帮助我们调整视频的长度、播放速度以及播放顺序。掌握 FFmpeg 命令中的相关参数和用法将使视频处理变得更加高效。在这篇文章中…

pytest使用

主要技术内容 1.pytest设计 接口测试 框架设想 common—公共的东西封装 1.request请求 2.Session 3.断言 4.Log 5.全局变量 6.shell命令 ❖ config---配置文件及读取 ❖ Log— ❖ payload—请求参数—*.yaml及读取 ❖ testcases—conftest.py; testcase1.py…….可…

2024年【熔化焊接与热切割】考试题及熔化焊接与热切割考试总结

题库来源:安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试题是安全生产模拟考试一点通生成的,熔化焊接与热切割证模拟考试题库是根据熔化焊接与热切割最新版教材汇编出熔化焊接与热切割仿真模拟考试。2024年【熔化焊接与热切割】考试题及熔化…

vue-plugin-hiprint 打印 预览打印+静默打印

1.安装 npm install vue-plugin-hiprint npm i socket.io-client --save //为了静默打印 &#xff08;为此还需安装客户端&#xff09; 2…html页面 引入css <link rel"stylesheet" type"text/css" media"print" href"https://cdn.jsde…

创新大赛中财务预测的策略与技巧

创新大赛中财务预测的策略与技巧 前言财务预测的重要性财务预测的步骤财务预测的关键要素注意事项结语 前言 在当今快节奏、竞争激烈的商业环境中&#xff0c;创新不仅是推动企业成长的动力&#xff0c;更是衡量一个项目能否在市场中脱颖而出的关键。创新大赛作为展示这些创新成…

星耀巴黎,竞猜有礼!为运动健儿加油,让世界看见中国力量

即将高燃来袭首金荣耀&#xff0c;让我们拭目以待&#xff01; 当象征着“更快、更高、更强”的号角再次吹响&#xff0c;谁又能在这场全球瞩目的体育盛宴中&#xff0c;率先触碰那份至高无上的荣耀&#xff1f;“首金”不仅是一个国家或地区体育实力的象征&#xff0c;更是运…

1台solidworks图形工作站同时给5人一起使用

在日益发展的科技环境中&#xff0c;团队协作已成为各个行业不可或缺的一一部分。对于工程设计和图形处理领域而言&#xff0c;SolidWorks等强 大的三维建模和仿真软件成为了日常工作的重要工具。 随着团队规模的扩大和项目复杂性的增加&#xff0c;如何高效、稳定地为多人提供…

Java入门:05.Java中的数组002

通过上篇文章&#xff0c;相信大家对数组应该有了一个简单的了解&#xff0c;并对Java中的数据类型有了一个基本的认识&#xff0c;不仅如此我们还明白了怎样定义一个数组类型的变量&#xff0c;在这之后&#xff0c;让我们一起来更加深入的了解一下数组吧。 三、如何创建一个…

Axure软件新功能解析与应用技巧分享

Axure是一种用于创建原型和交互设计的软件工具&#xff0c;广泛应用于操作界面。&#xff08;UI&#xff09;和客户体验&#xff08;UX&#xff09;为了展示和测试应用程序、网站或其他数据产品的性能和操作界面&#xff0c;设计帮助产品经理、设计师和开发者制作具有交互性的原…

Ghost Buster Pro for Mac:系统优化的得力助手

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件、系统日志、下载历史记录、缓存和临时文件…

每日任务:TCP/IP模型和OSI模型的区别

介绍一下TCP/IP模型和OSI模型的区别&#xff1f; OSI模型由国标准化组织提出&#xff0c;而TCP/IP模型是由美国国防部开发的&#xff1b; OSI模型由七个层次组成&#xff0c;从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP模型只有四层…

Text Control 控件教程:使用 .NET C# 中的二维码和条形码增强文档

QR 码和条形码非常适合为文档和 PDF 文件增加价值&#xff0c;因为它们提供轻松的信息访问、验证信息、跟踪项目和提高交互性。条形码可以弥补纸质或数字人类可读文档与网络门户或网络应用程序中的数字信息之间的差距。大多数用户都熟悉 QR 码和条形码&#xff0c;它们在许多过…

宠物空气净化器是不是智商税?靠谱的浮毛空气净化器推荐

宠物空气净化器是不是智商税&#xff1f;宠物空气净化器是否真有其效&#xff0c;是许多由于要不要买空气净化器养宠人心中的疑惑。作为呼吸科的医生&#xff0c;我深知优质的空气质量对预防呼吸系统疾病的重要性。因此&#xff0c;我建议所有有条件的家庭&#xff0c;尤其是家…

IO多路复用——select

仅一个线程、进程处理并发 IO多路转接&#xff08;复用&#xff09;之select 跨平台适用linux&#xff0c;windows 底层&#xff1a;线性表 IO多路转接&#xff08;复用&#xff09;之poll 适用linux 底层&#xff1a;线性表 IO多路转接&#xff08;复用&#xff09;之epo…

Ecovadis评估方案

在当今全球供应链日益复杂且环保意识日益增强的背景下&#xff0c;EcoVadis评估方案作为一种领先的可持续发展评估工具&#xff0c;正逐步成为企业衡量其社会责任与环境绩效的重要标尺。EcoVadis通过一套全面而细致的评价体系&#xff0c;帮助企业识别其在可持续发展方面的优势…

pdf自动生成书签

PDF 自动生成书签&#xff0c;使用软件【PDF补丁丁】 软件官网&#xff1a; https://www.cnblogs.com/pdfpatcher/Github&#xff1a;https://github.com/wmjordan/PDFPatcher参考视频内容&#xff1a;使用PDFPatcher自动生成PDF书签 直接从软件官网下载压缩包&#xff0c;运…