Java面试题、八股文——JVM篇最终篇
1.如何选择垃圾收集器?
选择合适的垃圾收集器(Garbage Collector, GC)对于优化Java应用程序的性能至关重要。不同的应用场景和系统需求可能需要不同类型的垃圾收集器来满足。以下是一些考虑因素以及常见的垃圾收集器选项,帮助您做出选择:
考虑因素:
- 应用响应时间:如果您正在构建一个需要低延迟的应用程序,例如在线交易系统或实时游戏,那么您可能需要选择能够最小化暂停时间的垃圾收集器。
- 吞吐量:对于后台处理或者批处理任务来说,高吞吐量比低延迟更重要,这意味着您可以接受更长的垃圾回收暂停时间以换取更高的整体效率。
- 内存占用:如果您的应用运行在资源受限的环境中,如嵌入式系统,则需要考虑垃圾收集器对内存使用的影响。
- 堆大小:不同垃圾收集器对大堆和小堆的支持程度不同,选择时需要考虑您的应用预计使用的堆大小。
- 并发性:现代垃圾收集器通常支持一定程度的并发操作,以减少对应用线程的影响。
常见的垃圾收集器:
- Serial Collector:适合于客户端场景,特别是小型应用或嵌入式系统。它使用单个线程进行垃圾回收,适用于单核处理器或内存有限的环境。
- Parallel Collector(也称作Throughput Collector):通过多线程并行执行垃圾回收,旨在最大化应用的整体吞吐量。适合于多核处理器上的后台处理或批处理应用。
- Concurrent Mark Sweep (CMS) Collector:旨在减少垃圾回收引起的暂停时间,适合于对响应时间有较高要求的应用。但它的缺点是可能会产生更多的内存碎片,并且在某些情况下会降低吞吐量。
- G1 Collector(Garbage First):设计用于具有大堆的多核机器上运行的应用。它将堆划分为多个区域,并优先回收那些垃圾最多的区域,从而试图平衡吞吐量和响应时间。
- ZGC 和 Shenandoah Collector:这两个都是实验性的垃圾收集器,设计目标是在大型堆上实现非常低的暂停时间(通常小于10毫秒)。它们特别适合于需要极低延迟的高性能应用。
如何选择:
- 评估需求:首先明确您的应用对延迟、吞吐量、内存使用等方面的要求。
- 测试与比较:在实际环境中测试不同的垃圾收集器,观察其对应用性能的影响。
- 调优参数:根据测试结果调整垃圾收集器的相关参数,比如初始堆大小、最大堆大小等。
- 持续监控:即使选择了垃圾收集器,也需要定期监控应用的性能指标,确保其始终符合预期。
2. 什么是类加载器?
类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将字节码文件(.class 文件)加载到内存中,并转换成可以被虚拟机执行的方法区中的运行时数据结构。类加载器在Java中扮演着至关重要的角色,因为它不仅决定了应用程序如何访问类文件,还影响了类的可见性和安全性。
类加载器的工作机制
- 加载:类加载器从文件系统、网络或其他来源读取类的二进制数据,并将其转换为方法区中的运行时数据结构。
- 链接:包括验证、准备和解析三个步骤。
- 验证:确保加载的类文件格式正确,没有安全问题。
- 准备:为类的静态变量分配内存,并设置默认值。
- 解析:将符号引用转换为直接引用,这个过程涉及到查找和替换类、接口、字段和方法的符号引用。
- 初始化:执行类构造器 () 方法,即初始化类的静态变量和静态代码块。
类加载器的层次结构
Java中的类加载器采用了一种称为“双亲委派模型”的层级结构。这种模型确保了类加载过程的安全性和一致性。
- Bootstrap ClassLoader:这是最顶层的类加载器,由C++编写,不是Java类的一部分。它负责加载核心Java类库(如 java.lang.*),位于 rt.jar 中。
- Extension ClassLoader(扩展类加载器):负责加载标准扩展库中的类,通常位于 $JAVA_HOME/lib/ext 目录下。
- Application ClassLoader(应用类加载器):也称为系统类加载器,负责加载应用程序的类路径(classpath)中指定的类文件。
自定义类加载器
除了上述内置的类加载器外,开发人员还可以创建自定义类加载器来实现特定的功能,如从网络加载类、加密类文件等。自定义类加载器通常继承自 java.lang.ClassLoader 类,并重写 findClass() 或 loadClass() 方法。
双亲委派模型
双亲委派模型是指当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的Bootstrap类加载器中。只有当父类加载器无法加载该类(即在其加载范围之外)时,子加载器才会尝试自己加载。
这种模型的好处在于:
- 安全性:防止用户自定义的类伪装成核心类库中的类,因为核心类库总是先被加载。
- 避免重复加载:保证所有加载器之间的类加载协调一致,避免同一个类被多次加载。
3.什么是 tomcat 类加载机制?
Tomcat 是一个广泛使用的开源 Servlet 容器,它支持 Java Servlet 和 JavaServer Pages (JSP) 技术。Tomcat 的类加载机制是其核心功能之一,它确保了不同Web应用程序之间的隔离性和安全性。以下是关于 Tomcat 类加载机制的详细介绍:
类加载器层次结构
Tomcat 采用了类似于 Java 标准的双亲委派模型,但为了适应 Web 应用程序的需求,增加了一些额外的类加载器。以下是 Tomcat 类加载器的层次结构:
- Bootstrap ClassLoader:
- 这是最顶层的类加载器,负责加载核心的 Java 类库,如 java.lang.*。
- 通常由 JVM 提供,不是 Java 类的一部分。
- System ClassLoader(也称为 Application ClassLoader):
- 负责加载应用程序的类路径(classpath)中指定的类文件。
- 包括 JDK 的扩展库(如 $JAVA_HOME/lib/ext 目录下的类)。
- Common ClassLoader:
- 加载 $CATALINA_HOME/lib 目录下的类文件。
- 这些类对所有 Web 应用程序都是可见的。
- Catalina ClassLoader:
- 加载 $CATALINA_HOME/server 目录下的类文件。
- 这些类仅对 Tomcat 服务器内部使用,对 Web 应用程序不可见。
- Shared ClassLoader:
- 加载 $CATALINA_HOME/shared 目录下的类文件。
- 这些类对所有 Web 应用程序都是可见的,但不推荐使用,因为这可能导致类加载冲突。
- WebApp ClassLoader:
- 每个 Web 应用程序都有自己的 WebApp ClassLoader。
- 负责加载 Web 应用程序的 WEB-INF/classes 目录和 WEB-INF/lib 目录下的类文件。
- 这些类只对当前 Web 应用程序可见,实现了应用程序之间的隔离。
类加载顺序
Tomcat 的类加载顺序遵循以下规则:
双亲委派模型:
- 当一个类加载器收到类加载请求时,它首先会委托给父类加载器去加载。
- 只有当父类加载器无法加载该类时,子类加载器才会尝试加载。
WebApp ClassLoader 的特殊行为: - WebApp ClassLoader 在某些情况下会优先加载本地类,而不是委托给父类加载器。
- 这是为了允许 Web 应用程序覆盖 Tomcat 或 JDK 中的类,尽管这种做法并不推荐。
示例
假设有一个 Web 应用程序部署在 Tomcat 上,其类加载路径如下:
- Bootstrap ClassLoader:加载核心 Java 类库。
- System ClassLoader:加载 JDK 扩展库和应用程序类路径中的类。
- Common ClassLoader:加载 $CATALINA_HOME/lib 目录下的类。
- WebApp ClassLoader:加载 WEB-INF/classes 和 WEB-INF/lib 目录下的类。
当应用程序请求加载某个类时,类加载器的查找顺序如下:
- Bootstrap ClassLoader 尝试加载。
- 如果未找到,System ClassLoader 尝试加载。
- 如果未找到,Common ClassLoader 尝试加载。
- 如果未找到,WebApp ClassLoader 尝试加载。
注意事项
类加载冲突:
- 避免在 WEB-INF/lib 或 WEB-INF/classes 中包含与 Tomcat 或 JDK 冲突的类。
- 使用 shared 目录时要特别小心,因为这可能导致类加载冲突。
类加载器隔离:
- 每个 Web 应用程序的 WebApp ClassLoader 是独立的,确保了不同应用程序之间的类隔离。
性能优化:
- 合理组织类文件的位置,避免不必要的类加载,可以提高应用程序的启动和运行性能。
通过理解和合理配置 Tomcat 的类加载机制,可以有效地管理 Web 应用程序的类加载行为,确保应用程序的稳定性和性能。
相关文章:
Java面试题、八股文——JVM篇最终篇
1.如何选择垃圾收集器? 选择合适的垃圾收集器(Garbage Collector, GC)对于优化Java应用程序的性能至关重要。不同的应用场景和系统需求可能需要不同类型的垃圾收集器来满足。以下是一些考虑因素以及常见的垃圾收集器选项,帮助您做…...
Spring Boot整合Redis Stack构建本地向量数据库相似性查询
Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中,数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统,不仅可以用作缓存、消息代理,还可以扩展为向量数据库,实现高效的相…...
shell脚本基础学习_总结篇(完结)
细致观看可以,访问shell脚本学习专栏,对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义: 2. 主要特点: 3. shell脚本的基本结构 4. S…...
什么是 C++ 中的函数对象?它有什么特点?
在 C 中,函数对象(Function Object)是一种可调用对象,它允许像函数一样被调用,但实际上它可能并不是真正的函数。函数对象可以是以下几种类型之一: 普通函数: 一个普通的、定义在命名空间或类…...
css:项目
这是一个完整的网站制作的流程 美工会先制作一个原型图: 原型图写的不详细,就是体现一个网页大致的布局 然后美工再做一个psd样例图片 然后再交给程序员 项目 模块化开发:把代码的不同的样式封装起来,需要用到相同样式的标签就…...
macOS 开发环境配置与应用开发指南
macOS 开发环境配置与应用开发指南 macOS作为苹果公司推出的操作系统,因其稳定性、优雅的用户界面和强大的开发支持,已成为开发者和创意专业人士的首选平台之一。无论是开发iOS、macOS桌面应用,还是Web应用、跨平台程序,macOS都提…...
[A-19][V06]ARMv8/v9-内存虚拟化原理
ver0.2 [看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章] 前言 前一篇文章,我们介绍了ARM内存的属性,算是一个小小的里程碑点,接下来我们会把注意力重新拉回虚拟化的赛道。我们从[V-05] 虚拟化基础-异常模型(Exception model)之后,花了很多笔墨介绍…...
registry 删除私有仓库镜像
原文链接:https://blog.csdn.net/yogima/article/details/122172744 如果需要彻底删除,只需进行register 磁盘删除镜像 彻底删除了,就可以到达彻底删除的目的。 如果只需要软删除,则只需进行通过API删除。 curl --header "Ac…...
UPLOAD LABS | UPLOAD LABS 靶场初识
关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01:UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境,用于帮助用户了解文件上传漏洞的…...
Samba服务器常见问题处理
指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接,首先请断开所有现有的连接到网络共享的映射 解决方案 单击“开始”菜单,选择“运行…”。 在弹出的窗口中,输入cmd 进入命令行模式,并输入…...
Java基础 设计模式——针对实习面试
目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式(Singleton Pattern) 定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。适用场景&…...
最大公约数和最小公倍数-多语言
目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 程序分析: 最小公倍数输入的两个数之积除于它们的最大公约数,关键是求出最大公约数; 求最大公约数用辗转…...
第三方数据库连接免费使用和安装
是强大的一体化数据库开发解决方案,可从单一应用程序无缝连接多个数据库,包括 MySQL、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle、SQLite 和 Redis。 下载:https://download.csdn.net/download/mo3408/90045937 升级特性 模型&…...
水库大坝安全监测之量水堰计应用
量水堰计是水库大坝安全监测系统中的一种关键设备,主要用于测量水库水位、流量等水力参数。以下是量水堰计在水库大坝安全监测中的应用及注意事项: 一、量水堰计的工作原理 量水堰计是一种专门用于测量水流流量的仪器,其工作原理主要基于水流…...
算法笔记:滑动窗口
前言 滑动窗口作为一个考点较高的算法,广泛应用于子串问题中,本文将进行详细讲解。 一、滑动窗口是什么 滑动窗口是双指针算法的一种,基本思路为维护一个窗口,然后从前往后遍历元素进行运算。 二、滑动窗口算法和其他双指针算…...
Ubuntu下的Graphviz的基础使用方法
一、Graphviz介绍 graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局 1、什么是Graphviz 官网地址,https://www.graphviz.org/ Gr…...
微积分复习笔记 Calculus Volume 1 - 6.8 Exponential Growth and Decay
6.8 Exponential Growth and Decay - Calculus Volume 1 | OpenStax...
React的ts文件中通过createElement拼接一段内容出来
比如接口返回一个值 const values [23.00, 40.00/kg];想做到如下效果, 如果单纯的用render渲染会很简单, 但是在ts文件中处理,所以采用了createElement拼接 代码如下: format: (values: string[]) > {if (!values || !val…...
Pinia之1:介绍Pinia、项目中引入Pinia
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
Python双向链表、循环链表、栈
一、双向链表 1.作用 双向链表也叫双面链表。 对于单向链表而言。只能通过头节点或者第一个节点出发,单向的访问后继节点,每个节点只能记录其后继节点的信息(位置),不能向前遍历。 所以引入双向链表,双…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
