面试题:JVM(二)

1. 面试题

简述 Java 类加载机制?(百度)
JVM类加载机制  (滴滴)
JVM中类加载机制,类加载过程,什么是双亲委派模型? (腾讯)
JVM的类加载机制是什么? (京东)

2. 类的加载过程(生命周期)

2.1 类的加载分几步?

Java 类加载过程?(苏宁)
描述一下 JVM 加载 Class 文件的原理机制?(国美)
JVM底层怎么加载class文件的?(蚂蚁金服)
类加载过程 (蚂蚁金服)
Java 类加载过程? (百度)
描述一下 JVM 加载 Class 文件的原理机制? (蚂蚁金服)
Java类加载过程  (美团)
描述一下JVM加载class文件的原理机制  (美团)
什么是类的加载? (京东)
讲一下JVM加载一个类的过程 (京东)

 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:

2.2 Loading(装载阶段)

过程一:类的装载
所谓装载,简而言之就是将Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型——类模板对象。
 
装载完成的操作
装载阶段,简言之,查找并加载类的二进制数据,生成Class的实例。
在加载类时,Java虚拟机必须完成以下3件事情:

  • 通过类的全名,获取类的二进制数据流。
  • 解析类的二进制数据流为方法区内的数据结构(Java类模型)
  • 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口

2.3 Linking(链接阶段)

链接中分为三个阶段:Verification(验证)、Preparation(准备)、Resolution(解析)

2.3.1 Verification(验证)

该阶段主要是保证加载的字节码是合法、合理并符合规范的。

2.3.2 Preparation(准备)

该阶段为类的静态变量分配内存,并将其初始化为默认值

注意:
1. 这里不包含基本数据类型的字段用static final修饰的情况,因为final在编译的时候就会分配了,准备阶段会显式赋值。
2. 注意这里不会为实例变量分配初始化,实例变量是会随着对象一起分配到Java堆中。
3. 在这个阶段并不会像初始化阶段中那样会有初始化或者代码被执行。

2.3.3 Resolution(解析)

所谓解析就是将符号引用转为直接引用,也就是得到类、字段、方法在内存中的指针或者偏移量。因此,可以说,如果直接引用存在,那么可以肯定系统中存在该类、方法或者字段。但只存在符号引用,不能确定系统中一定存在该结构。

2.4 Initialization(初始化阶段) 

该阶段为类的静态变量赋予正确的初始值(显示初始化)

类的初始化是类装载的最后一个阶段。如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中。此时,类才会开始执行Java字节码。(即:到了初始化阶段,才真正开始执行类中定义的 Java 程序代码。)

类加载的时机 (百度)
Class的forName("Java.lang.String")和Class的getClassLoader()的loadClass("Java.lang.String")有什么区别?  (百度)
哪些情况会触发类的加载? (京东)

类的加载 = 装载+链接(①②③)+初始化 

 2.5 类的Using(使用阶段)

开发人员可以在程序中访问和调用它的静态类成员信息(比如:静态字段、静态方法),或者使用new关键字为其创建对象实例。

2.6 类的UnLoading(卸载阶段) 

一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。

3. 类的加载器

什么是类加载器,类加载器有哪些?(苏宁)
简单说说你了解的类加载器(拼多多)
类加载器都有哪些?(百度) 
类加载器有哪些?  (腾讯)
什么是类加载器,类加载器有哪些?(字节跳动) 

3.1 概述

类加载器是 JVM 执行类加载机制的前提。
 
ClassLoader的作用:
ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。
 
因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由Execution Engine决定。

通常类加载机制有三个基本特征:
 

  • 双亲委派模型。但不是所有类加载都遵守这个模型,有的时候,启动类加载器所加载的类型,是可能要加载用户代码的,比如JDK内部的ServiceProvider/ServiceLoader机制,用户可以在标准API框架上,提供自己的实现,JDK也需要提供些默认的参考实现。例如,Java 中JNDI、JDBC、文件系统、Cipher等很多方面,都是利用的这种机制,这种情况就不会用双亲委派模型去加载,而是利用所谓的上下文加载器。
  • 可见性。子类加载器可以访问父加载器加载的类型,但是反过来是不允许的。不然,因为缺少必要的隔离,我们就没有办法利用类加载器去实现容器的逻辑。
  • 单一性。由于父加载器的类型对于子加载器是可见的,所以父加载器中加载过的类型,就不会在子加载器中重复加载。但是注意,类加载器“邻居”间,同一类型仍然可以被加载多次,因为互相并不可见。

 3.2 分类

JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)自定义类加载器(User-Defined ClassLoader)

启动类加载器(引导类加载器,Bootstrap ClassLoader)

扩展类加载器(Extension ClassLoader)
应用程序类加载器(系统类加载器,AppClassLoader)

用户自定义类加载器

 4. 双亲委派机制

双亲委派好处有哪些?(亚信)
类加载器双亲委派模型机制?(苏宁)
双亲委派机制 (蚂蚁金服)
双亲委派机制及使用原因 (蚂蚁金服)
类加载器的双亲委派模型是什么? (蚂蚁金服)
双亲委派模型介绍一下  (小米)
讲一下双亲委派模型,以及其优点  (滴滴)
类加载器的双亲委派模型是什么? (京东)

4.1 概述 

 1.定义
如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回。只有父类加载器无法完成此加载任务时,才自己去加载。
 
2.本质
规定了类加载的顺序是:引导类加载器先加载,若加载不到,由扩展类加载器加载,若还加载不到,才会由系统类加载器或自定义的类加载器进行加载。

4.2 优势与弊端

1.双亲委派机制优势

  • 避免类的重复加载,确保一个类的全局唯一性

Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关系可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。

  • 保护程序安全,防止核心API被随意篡改

 
 
2.双亲委托模式的弊端

检查类是否加载的委托过程是单向的,这个方式虽然从结构上说比较清晰,使各个ClassLoader的职责非常明确,但是同时会带来一个问题,即顶层的ClassLoader无法访问底层的ClassLoader所加载的类。 

4.3 破坏双亲委派机制

双亲委派机制可以打破吗?为什么 (京东)
可以打破双亲委派么,怎么打破。(拼多多)

可以,例如,JNDI通过引入线程上下文类加载器来加载SPI的代码,Tomcat的类加载器优先自行加载应用目录下的class而不是先委派给父加载器,以及OSGi实现模块化热部署(脚本语言动态刷新部署)时为每个模块都自定义了类加载器等。这些场景都出于特定的需求和考虑而打破了双亲委派机制。

打破双亲委派机制的方法通常涉及编写自定义类加载器,并覆盖其loadClass方法。

4.4 Tomcat类加载机制

什么是tomcat类加载机制?(猎聘)
请解释tomcat的类加载机制?(阿里) 

Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类,各个web应用自己的类加载器(WebAppClassLoader)会优先查看自己的仓库加载,加载不到时再交给commonClassLoader走双亲委托。(Tomcat的类加载器优先自行加载应用目录下的class而不是先委派给父加载器)

5. 类加载结构的变化

当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器完成加载。 

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

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

相关文章

【c++日常刷题】两个数字的交集、点击消除、最小花费爬楼梯

两个数字的交集⭐ 两个数组的交集_牛客题霸_牛客网 (nowcoder.com) 题目描述: 解题思路: 通过遍历num1,如果遍历到的元素如果在num2中能找到,则这是num1和num2的公告元素; 这里需要借助两个数组来实现:…

energy 发布 v2.4.5

更新内容 修复 energy cli install 命令安装开发环境 修复 动态库加载error未暴露 增加 JS ipc.on 监听模式,异步返回结果 修复 energy cli 不能强制退出问题 修复 MacOS 开发模式 debug 时不更新 helper 进程 优化 energy cli 在 MacOS 开发模式和安装包制作 link…

LeetCode 19. 删除链表的倒数第 N 个结点(java)

目录 题目描述: 代码: 第一种: 第二种: 题目描述: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:h…

IMU应用于监测进食

最近,日本研究团队成功研发了一种创新的进食速度监测系统,巧妙融合IMU技术,旨在深入研究并有效评估个体在自由生活环境下的进食习惯。 实验中,科研团队把IMU传感器固定在受试者佩戴的腕带中,以监测并记录进食手腕时的运…

WSL开发--利用Git连接远程仓库(详细步骤)

这篇文章主要介绍了如何将本地项目推送到 GitLab 上,并且避免每次提交都需要输入用户名和密码。文中分步讲解了配置 GitLab SSH 密钥以及配置 Git 远程仓库地址的方法。以下是文章的优化和简洁版: 将本地项目推送到 GitLab 并配置 SSH 免密登录 为了方便…

LeetCode100之盛最多水的容器(11)--Java

1.问题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量 注意 你不能倾斜容器 示例1 输入&…

算法实现 - 快速排序(Quick Sort) - 理解版

文章目录 算法介绍算法分析核心思想三个版本运行过程挖坑法Hoare 原版前后指针法 算法稳定性和复杂度稳定性时间复杂度平均情况O(nlogn)最差情况O( n 2 n^2 n2) 空间复杂度 算法介绍 快速排序是一种高效的排序算法,由英国计算机科学家C. A. R. Hoare在1960年提出&a…

设备搜索相关协议使用

一、实现原理 首先,Client -> Gateway : 发送 UDP 广播包(含厂商自定义协议)这一步表示客户端开始向网络中发送一个包含厂商自定义协议的 UDP 广播包,目的是寻找本厂商的设备(网关)。客户端此时处于活动状态activa…

视频去水印怎么办?两种方法教会你

视频有水印的话确实很恼火,想要干净的去除视频水印,这里分享两种简单又实用的方法。 方法一:美图秀秀 大家都熟悉的修图神器,功能超全。不仅能把照片P得美美哒,还能去掉照片和视频上的水印呢!用起来挺顺手…

【案例】旗帜飘动

开发平台:Unity 6.0 开发工具:Shader Graph 参考视频:Unity Shader Graph 旗帜飘动特效   一、效果图 二、Shader Graph 路线图 三、案例分析 核心思路:顶点偏移计算 与 顶点偏移忽略 3.1 纹理偏移 视觉上让旗帜保持动态飘动&a…

PHP合成图片,生成海报图,poster-editor使用说明

之前写过一篇使用Grafika插件生成海报图的文章,但是当我再次使用时,却发生了错误,回看Grafika文档,发现很久没更新了,不兼容新版的GD,所以改用了intervention/image插件来生成海报图。 但是后来需要对海报…

智慧汇聚:十款企业培训工具打造学习型企业

在当今快速变化的商业环境中,企业要想保持竞争力,就必须不断适应新技术、新市场和新的工作方式。构建一个学习型企业,不仅能够促进员工的个人成长,还能增强团队的整体能力和企业的创新能力。为了实现这一目标,借助先进…

「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

pycharm调用方法时显示为灰色

不用担心,亮的证明是被用过得,灰色的没有被用,引用一下就会变正常了

机器学习:我们能用机器学习来建立投资模型吗

机器学习模型能解决什么投资问题? 利用机器学习解决投资问题的思路,其实和在互联网领域解决推荐、广告问题的思路是一样的,只不过利用的特征完全变了。推荐、广告模型利用的是用户的年龄、性别,物品的类别、价格等特征&#xff0c…

ClkLog企业版(CDP)预售开启,更有鸿蒙SDK前来助力

新版本发布 ClkLog在上线近1年后,获得了客户的一致肯定与好评,并收到了不少客户对功能需求的反馈。根据客户的反馈,我们在今年三季度对ClkLog的版本进行了重新的规划与调整,简化了原有的版本类型,方便客户进行选择。 与…

【Java设计模式】16-26章

行为型模式: 第16章 12模板方法模式(Template) 16.1 豆浆制作问题 16.2 模板方法模式基本介绍 16.3 模板方法模式原理类图 16.4 模板方法模式解决豆浆制作问题 package com.atguigu.template;//抽象类,表示豆浆 public abstract class SoyaMilk {//模板…

上市公司环境信息披露质量评分数据王婉菁版(2008-2023年)噪声光污染辐射废水减排等治理

数据来源基础数据来源于上市公司年报、社会责任报告、环境报告以及证监会和统计局。时间跨度2008-2023区域跨度企业及行业层面 核心解释变量:环境信息披露质量,是由上市公司环境管理、负债、业绩于治理、披露载体等各项信息披露质量评分加总。 被解释变…

Llama 3.2 Vision Molmo:多模态开源生态系统基础

编者按: 视觉功能的融入对模型能力和推理方式的影响如何?当我们需要一个既能看懂图像、又能生成文本的 AI 助手时,是否只能依赖于 GPT-4V 这样的闭源解决方案? 我们今天为大家分享的这篇文章,作者的核心观点是&#xf…

el-table 滚动条重置 手动控制滚动条

最近在使用 el-table 的时候,出现一个问题: 表头过长的时候,会有左右滑动的操作,当我们把表格拉到最右侧,这个时候重新请求数据的话,表格位置还是在最右侧,不会恢复原位。 那我们想恢复原位&a…