java面试-- 必问之jvm与性能优化(一)

article/2025/8/11 12:47:45

问题一、 描述一下 JVM 加载 Class 文件的原理机制?

JVM(Java虚拟机)加载Class文件的原理机制是Java程序运行的关键组成部分。这一过程涉及到多个阶段,确保Java程序能够跨平台运行,并动态地加载、解析和执行Java Class文件。以下是JVM加载Class文件的主要步骤和原理:

1. 类加载:

  • JVM首先通过类加载器(ClassLoader)将Java类加载到内存中。类加载器负责从文件系统、JAR包或其他地方查找和加载所需的class文件。
  • Java虚拟机规范定义了三种主要的类加载器:启动类加载器(Bootstrap
    ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System
    ClassLoader)。
  • 类加载器可以根据类的全名加载Java类,但需要注意的是,对于同一个类名,不同的类加载器可能会加载不同的类。

2. 加载阶段:

  • 在加载阶段,JVM主要完成三件事情:通过全类名获取定义此类的二进制字节流;将字节流所代表的静态存储结构转换为方法区的运行时数据结构;在内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口。

  • 获取二进制字节流的方式非常灵活,可以从本地系统、ZIP包、网络、动态代理技术运行时动态生成、其他文件(如JSP)或数据库中获取。

3. 链接阶段:

  • 链接阶段包括验证、准备和解析三个子阶段。验证确保被加载的类信息符合JVM规范,没有安全方面的问题;准备为类的静态变量分配内存,并将其初始化为默认值;解析则是把类中的符号引用转换为直接引用。

4. 初始化阶段:

  • 在初始化阶段,JVM为类的静态变量赋予正确的初始值,执行类构造器方法()中的代码。

值得注意的是,这些阶段通常不是按顺序进行或完成的,而是互相交叉地混合进行的。例如,在加载阶段可能会调用或激活其他阶段。

JVM通过这一系列的步骤和机制,实现了对Java Class文件的动态加载和执行,为Java程序的跨平台运行提供了坚实的基础。同时,类加载器双亲委派模型等机制确保了类的加载过程的安全性和一致性。

问题二、 什么是类加载器?

类加载器(ClassLoader)是Java运行时环境(JRE)中负责动态加载Java类到JVM内存的重要组件。它是Java核心类库java.lang中的一个重要类。类加载器的主要职责根据一个类的全名(包括包名)来查找或加载这个类的.class文件,并将其加载到Java虚拟机中,形成对应的Class对象

类加载器在Java中扮演了非常重要的角色,它是实现Java动态性的关键机制之一。通过类加载器,Java应用程序可以在运行时动态地加载和卸载类,从而实现插件式架构、热部署等高级功能

问题三、 类加载器有哪些?

在Java中,类加载器(ClassLoader)是用于动态加载Java类的关键组件。Java提供了几种不同类型的类加载器,它们共同构成了Java的类加载机制。以下是Java中常见的类加载器类型:

1. 启动类加载器(Bootstrap ClassLoader):

  • 也称为原始类加载器,是JVM自身的一部分。
  • 主要负责加载Java的核心类库,如java.lang.*等。
  • 它不是java.lang.ClassLoader的子类,而是由JVM的启动机制来初始化。
  • 加载扩展类和应用程序类加载器,并指定它们的父加载器。

2. 扩展类加载器(Extension ClassLoader):

  • 由 sun.misc.Launcher$ExtClassLoader 实现。
  • 负责加载Java的扩展目录(通常是$JAVA_HOME/lib/ext目录)中的类库。
  • 它是启动类加载器的子加载器。

3. 系统类加载器(System ClassLoader):

  • 也称为应用类加载器(Application ClassLoader)。
  • 由sun.misc.Launcher$AppClassLoader实现。
  • 负责加载应用程序的类路径(classpath)上指定的类。
  • 它是扩展类加载器的子加载器,并且是大多数应用程序默认的类加载器。

4. 自定义类加载器:

  • 通过继承 java.lang.ClassLoader 类,开发者可以创建自己的类加载器。
  • 自定义类加载器可以用于实现特定的类加载逻辑,如从网络加载类、从数据库中加载类、实现类的加密和解密等。
  • 自定义类加载器在热部署、代码隔离、插件系统等场景中非常有用。

在Java的类加载机制中,类加载器之间通常遵循双亲委派模型(Parent Delegation Model)。当一个类加载器需要加载一个类时,它首先会把这个请求委派给父类加载器去完成,每一层的类加载器都是如此。只有当父类加载器无法完成这个加载请求时,子加载器才会尝试自己去加载。这种机制确保了Java核心类库的安全性和稳定性。

问题四、什么是tomcat类加载机制?

Tomcat类加载机制是指Tomcat服务器在运行时如何加载Java类的过程。Tomcat使用了一种特定的类加载器层次结构来确保Web应用程序的类能够正确、安全地加载。

Tomcat的类加载器层次主要包括以下几个部分:

1. Bootstrap类加载器:

  • 这是JVM自带的类加载器,主要负责加载Java的核心类库,如java.lang.*等。
  • 位于jre/lib/ext下。

2. System类加载器:

也称为扩展类加载器,负责加载Tomcat自身的类库,如bootstrap.jar等。这些类库通常位于Tomcat安装目录下的lib或bin文件夹中。
在这里插入图片描述

3. Common类加载器:

这个类加载器负责加载Tomcat服务器以及所有Web应用程序共享的类库。这些类库通常位于Tomcat的lib目录下。
在这里插入图片描述

4. Web应用程序类加载器:

每个在Tomcat中部署的Web应用程序都有自己的类加载器。这个类加载器负责加载该应用程序特定的类库,这些类库通常位于Web应用程序的WEB-INF/lib目录下,以及WEB-INF/classes目录下的类文件。
在这里插入图片描述

当应用需要到某个类时,则会按照下面的顺序进行类加载:

1 使用bootstrap引导类加载器加载

2 使用system系统类加载器加载

3 使用应用类加载器在WEB-INF/classes中加载

4 使用应用类加载器在WEB-INF/lib中加载

5 使用common类加载器在CATALINA_HOME/lib中加载

问题五、简单描述Java 类加载过程?

java类加载过程是指JVM将类的.class文件中的字节码装载到内存中,并进行验证、准备、解析和初始化等一系列步骤的过程。这个过程由类加载器负责执行,确保了Java程序的正常运行。

以下是Java类加载过程的主要步骤:

1. 加载(Loading):

类加载器通过类的全名获取定义此类的二进制字节流。这些字节流通常来自.class文件,但也可以从网络、数据库或其他来源获取。
加载阶段会将字节流转换为JVM内部的数据结构,并生成一个代表该类的Class对象,作为方法区这些数据的访问入口。

2. 验证(Verification):

在连接阶段,JVM会对加载的类进行验证,以确保其符合Java虚拟机规范,没有安全问题。
验证过程会检查类的格式、语义和操作码等,防止恶意代码的执行。

3. 准备(Preparation):

准备阶段为类的静态变量分配内存,并赋予默认值
注意,此时不会实际初始化静态变量,只是为其分配内存空间

4. 解析(Resolution):

解析阶段是将常量池内的符号引用替换为直接引用的过程。
这使得后续可以直接通过内存地址或偏移量进行访问,提高了效率。

5. 初始化(Initialization):

初始化阶段是类加载过程的最后一步,它执行类的静态初始化代码和初始化静态变量。
静态初始化代码通常位于静态块中,它们会在类首次被主动使用时执行。
JVM会确保在多线程环境下,类的初始化过程只会被一个线程执行。

在整个类加载过程中,类加载器起着关键作用。JVM提供了三种主要的类加载器:启动类加载器、扩展类加载器和系统类加载器。这些加载器遵循双亲委派模型,即当一个类加载器需要加载一个类时,它会首先将这个请求委派给它的父类加载器去完成。这种机制有助于保证Java核心类库的安全性和一致性。


http://www.hkcw.cn/article/OZgsMYEXHe.shtml

相关文章

JVM运行时数据区之虚拟机栈

【1】概述 Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。 栈是运行…

【Linux探索学习】第三十二弹——生产消费模型:基于阻塞队列和基于环形队列的两种主要的实现方法

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在前面我们已经学习了关于线程的主要知识,包括线程的基础知识以及线程的同步与互斥等内容,今天我们来学几个线程知…

复现FAST_LIVO2【Ubuntu 20.04.6 LTS】

目录 准备1 Ubuntu 和 ROS2 其他库2.1 PCL2.2 Eigen2.3 OpenCV 3 Sophus3.1 安装3.2 make报错 4 Vikit5 livox_ros_driver5.1 Livox-SDK5.2 livox_ros_driver FAST-LIVO2运行参考 准备 1 Ubuntu 和 ROS 依据开源介绍,Ubuntu 16.04~20.04。 复现版本为:…

【基于Ubuntu下Yolov5的目标识别】保姆级教程 | 虚拟机安装 - Ubuntu安装 - 环境配置(Anaconda/Pytorch/Vscode/Yolov5) |全过程图文by.Akaxi

目录 一.【YOLOV5算法原理】 1.输入端 2.Backbone 3.Neck 4.输出端 二.【系统环境】 1.虚拟机的安装与创建 2.安装Ubuntu操作系统 3.环境的配置 3.1.Ubuntu下Anacoda安装以及虚拟环境配置 3.2.Pytorch安装 3.3.Vscode安装 3.4.Yolov5源码及环境获取安装…

[已解决] 本地两台 win电脑 (以太网) 网线传输文件 - 局域网连接 (解决windows无法访问共享文件问题 - Windows 安全中心输入网络凭据 用户名/密码 不正确问题)

背景 由于要本地传输的数据比较大,大几百GB网盘传输慢,正好有网线,试着本地网线高速传输(实测113MB/s)踩了很多坑,想把亲测成功的经验分享出来帮助更多同学 目录 1 网线接入 2 设置两台电脑的IP地址 3 …

Docker(三):DockerFile

一、DockerFile介绍 1、DockerFile 介绍 DockerFile 是一种能够被Docker 程序解释的文件(一般为了方便理解称之为“剧本”)。 DockerFile 由一条一条的指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器 镜像中指定自己额外的需…

【Linux网络编程】第十弹---打造初级网络计算器:从协议设计到服务实现

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Protocol.hpp 1.1、Request类 1.1.1、基本结构 1.1.2、构造析构函数 1.1.3、序列化函数 1.1.4、反…

Ubuntu24安装Docker详细教程

目录 Ubuntu 安装 Docker 详细教程 一、安装环境说明 二、卸载旧版 Docker(若存在) 三、安装必要的依赖 四、添加 Docker 的 GPG 密钥 五、配置 Docker 的软件源 六、安装 Docker docker-compose离线安装 七、验证 Docker 是否安装成功 八、配置…

2024第八届御网杯信息安全网络大赛线上WP详解(misc+cryoto)(详解-思路-脚本)

芜湖~ 首届御网杯线上和ISCC分开进行 但还是用的ISCC的页面差评 嘻嘻 又是玄乎的一天 以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我 目录 附件 # Misc ##Notice ##编码转换 Brainfuck编码 jsfuck编码 Ook! 编码 ##bluetooth 导出压缩包 第一…

在Linux中安装、配置和挂载NFS的完整指南

一、NFS简介 NFS(Network File System) 是一种分布式文件系统协议,允许用户通过网络在不同主机间共享文件和目录。它适用于局域网环境,常用于服务器集群、数据共享等场景。本文详细介绍NFS服务端与客户端的安装、配置及挂载流程。…

Linux-Ubuntu下的git安装与配置

一、安装git 1.打开终端,运行以下命令(需要联网) sudo apt-get update sudo apt-get install git 2.验证安装 安装完成之后,通过运行以下命令验证git是否已经正确安装: git --version 二、配置git 2.1.配置用户名…

亲测可用:wsl2安装ubuntu22.04的GNOME桌面

本文主要介绍wsl安装的ubuntu如何配置图形化桌面,主要使用与windows操作系统环境,方便搭建Linux环境下的可视化开发环境,网上流传的很多教程都不能正确安装,以下是本人亲自验证可用的操作方法。 1、开始安装 1.1 配置源 sudo v…

个人健康中枢的多元化AI网络革新与精准健康路径探析

引言 随着数字化转型的深入推进,个人健康中枢作为集成化健康管理系统,正在从传统的单一功能向多元化的AI驱动方向快速发展。在这一背景下,新兴网络硬件技术,特别是DPU(数据处理单元)和全光网络的出现,为个人健康中枢的革新提供了前所未有的机遇。本研究将深入探讨这些技…

Linux《进程控制》

在之前的Linux《进程概念》当中我们已经了解了进程基本的概念,那么接下来在本篇当中我们将开始进程控制的学习;在本篇当中我们先会对之前的学习的创建子进程的系统调用fork再进行补充了解,并且再之后会重点的学习进程的终止、进程等待以及进程…

Java应用中 慢SQL导致内存无法回收,然后导致线程阻塞,CPU被撑爆

问题分析 慢SQL的直接危害 数据库连接池长时间被占用,导致线程堆积,请求阻塞。 未释放的 ResultSet、Statement 或 Connection 可能导致内存泄漏(例如未正确关闭资源)。 大结果集(如一次性加载百万条数据到内存&…

高质量AI歌曲生成器ACE-Step一键启动整合包,AI自动谱曲自动演唱

本次分享一款AI歌曲创作利器:ACE-Step,ACE-Step是刚发布不久的AI自动谱曲AI自动演唱软件,软件在歌曲生成速度、音乐连贯性和可控性上相对同类软件有了较大提升。ACE-Step在3小时前刚发布了新版本,我基于当前最新版本制作了免安装一…

Facebook 的隐私保护措施是否足够?技术观点

在数字时代,隐私保护成为了公众关注的焦点,尤其是对于拥有数十亿用户的社交媒体巨头 Facebook 来说,其隐私保护措施的有效性更是备受瞩目。本文将从技术角度探讨 Facebook 的隐私保护措施是否足够。 数据收集与使用 Facebook 收集用户数据的…

多语种OCR识别系统,引领文字识别新时代

在全球化与数字化深度融合的今天,语言障碍成为企业跨国协作、信息管理的一大挑战。无论是跨国合同签署、多语言档案管理,还是跨境商务沟通,高效精准的文字识别技术已成为刚需。中安智能OCR多语种识别系统应运而生,凭借其强大的光学…

强化学习实战:训练AI玩转OpenAI Gym

强化学习实战:训练AI玩转OpenAI Gym 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 强化学习实战:训练AI玩转OpenAI Gym摘要引言强化学习基础与算法分类1. 核心概念与数学表示2. 算法分类与…

前端实现导出element-plus表格和从后端获取数据导出,支持勾选导出

1. 纯前端实现导出 安装file-saver和xlsx file-saver: 用于在浏览器中触发文件的保存下载(保存为本地文件)。 使用场景: 当已经在 JavaScript 中生成了文件(如 Blob 对象),并想让用户保存它时使…