美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

在这里插入图片描述

更多大厂面试内容可见 -> http://11come.cn

美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

如何理解面向对象?

面向对象 是具有对象概念的编程范式,面向对象将程序实现分为了一个个独立的对象,各个对象之间又互相调用, 将对象作为程序的基本单元抽取出来 ,提升了可维护性、可复用性、灵活性

为何需要面向对象设计思想?

在没有面向对象的时候,随着软硬件环境逐渐复杂,代码的可维护性很差,因此急需一种设计思想来提升软件的 可维护性

而面向对象的可复用性正解决了这个问题,因此面向对象逐渐成为程序开发中的主流思想

封装、继承、多态的优势

面向对象中的核心概念为:封装、继承、多态

封装 隐藏了对象内部的实现细节,对外暴露出一个接口供其他对象使用

继承 新创建的对象继承现有对象的属性和方法,提升代码复用性

多态 允许一个类有多种不同的实现形式,解耦调用方与实现方,提升程序灵活性

Java 程序从代码编写完到程序运行起来,它经历了什么样的一个过程?

Java 程序的加载是借助于 JVM 虚拟机来进行加载的,因此这里面试官考察的是 JVM 虚拟机的类加载过程

1、编写代码:开发人员编写的代码文件为 .java 文件,

2、编译代码:Java 编译器将 .java 文件编译为二进制的 .class 文件

接下来进入到 JVM 加载 .class 文件的流程,分为加载、链接、初始化三个阶段:

加载

1、通过二进制字节流加载 class 文件

2、创建该 class 文件在方法区的运行时数据结构

3、创建字节码对象 Class 对象

链接

1、验证:目的在于确保 class 文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性

主要包括四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证

2、准备:为类变量(即静态变量)分配内存并且设置类变量的默认初始值,即零值。

这里不包含用 final 修饰的 static 变量,因为 final 修饰的变量在编译为 class 字节码文件的时候就会分配了,准备阶段会显式初始化

这里不会为实例变量分配初始化,类变量会分配在方法区,而实例变量是会随着对象一起分配到 Java 堆中

3、解析:将常量池内的符号引用转换为直接引用的过程

事实上,解析操作往往会伴随着 JVM 在执行完初始化之后再执行

符号引用就是一组符号来描述所引用的莫表。符号引用的字面量形式明确定义在《java虚拟机规范》的 Class 文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。

初始化

虚拟机在初始化阶段才真正开始执行类中编写的 Java 程序代码

初始化阶段就是执行类构造器 <clinit>() 方法的过程,<clinit>() 是 Javac 编译器自动生成的,该方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并生成的,如果一个类中没有静态代码块, 也没有变量赋值的动作,那么编译器可以不为这个类生成 <clinit>() 方法

之后 JVM 执行 Java 代码的 main() 方法,程序就开始执行

类是怎么被类加载器加载的?

采用双亲委派机制进行加载,JVM 在加载类的 class 文件时,Java虚拟机采用的是 双亲委派机制 ,即把请求交给父类加载器去加载

工作原理:

  1. 如果一个类加载器收到了类加载请求,他并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
  2. 如果父类加载器也存在其父类加载器,则继续向上委托
  3. 如果父类加载器可以完成类加载任务,就成功返回;如果父类加载器无法完成类加载任务,则会由自家在其尝试自己去加载

优势:

  1. 避免类的重复加载
  2. 保护程序安全,防止核心API被篡改(例如,如果我们自定义一个java.lang.String类,然后我们去new String(),我们会发现创建的是jdk自带的String类,而不是我们自己创建的String类)

1702216110216

扩展:哪里打破了双亲委派机制?为什么要打破?

  • 在实际应用中,可能存在 JDK 的基础类需要调用用户代码,例如:SPI 就打破双亲委派模式(打破双亲委派意味着上级委托下级加载器去加载类)
    • 比如,数据库的驱动,Driver 接口定义在 JDK 中,但是其实现由各个数据库的服务上提供,由系统类加载器进行加载,此时就需要 启动类加载器 委托子类加载器去加载 Driver 接口的实现

两个全限定类名相同的类可以同时被加载吗?

两个全限定类名相同的类可以同时被加载

JVM 在确定类的唯一性时,不仅考虑类的全限定名,还考虑了类加载器。这意味着,即使两个类的全限定名相同,只要它们被不同的类加载器加载,它们就被视为不同的类

这里以 Tomcat 为例来解释 ,Tomcat 是可以部署多个应用的,那么多个应用之间就可能会出现全限定类名相同的类,如果不可以同时被加载,毫无疑问应用会出现问题

因此 Tomcat 是通过自定义类加载器类 实现了可以同时加载多个全限定类名相同的类

Tomcat 会为部署的每个应用都生成一个类加载器实例:WebAppClassLoader,这样每个应用就可以使用自己的类加载器去加载自己的类,从而达到应用之间的隔离,不会出现类冲突

Tomcat 还利用了自定义加载器实现了热部署功能: 因为 class 文件是由类加载器来完成的,如果 class 文件变更了,Tomcat 就会将原来的类加载器销毁,再创建新的类加载器来加载修改后的文件,以实现热部署功能

Tomcat 打破了 JVM 的双亲委派机制: 因为 Tomcat 为了保证应用之间类的隔离性,通过 WebAppClassLoader 加载当前应用下的 class 文件,不会委派给父类加载器,打破了双亲委派机制

Tomcat 中的类加载器如下图 ,上边的 3 个是 JVM 默认的类加载器,下边的是 Tomcat 中定义的类加载器

image-20240414191908701

堆和栈有什么区别?

是在 JVM 启动时创建的内存区域去实现对象、数组与运行时常量的内存分配,它是虚拟机管理最大的,也是垃圾回收的主要内存区域

堆

是存储了线程执行的方法,每个方法作为一个栈帧存储,栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息

栈内存为线程私有的空间,每个方法在执行时都会创建一个栈帧,执行该方法时,就会将该方法所对应的栈帧入栈

栈

若程序OOM,该如何处理?

首先需要拿到 堆转储快照 进行分析,查看导致 OOM 的对象是否有必要存在,并且分析清除是因为哪些对象导致了 OOM

  • 如果是内存泄漏导致 OOM,可以查看泄露对象GC Roots的引用链,找到泄露对象在哪里被引用导致无法被回收

  • 如果不是内存泄漏,那么说明内存中的对象都是存活的,导致 OOM,这时应该检查虚拟机的堆内存设置是否有向上调整的空间。并且检查是否存在对象生命周期过长存储结构不合理的情况,减少程序运行中的内存消耗。

扩展:因为存储结构不合理而导致的堆内存溢出(来自于《深入理解Java虚拟机第3版》)

举例:使用 HashMap<Long, Long> 存储大量的数据,会导致浪费大量的空间,因为 HashMap 的空间效率使用太低。

对于一个 HashMap<Long, Long>来说,有效数据只有 Key、Value 的两个 long 型数据,占 16字节,long 数据被包装为 java.lang.Long 对象后,就分别具有 8 字节的 Mark Word、8字节的 Klass 指针、8字节的 long 型数值。两个 Long 对象组成 Map.Entry 之后,又多了 16 字节的对象头、8字节的 next 字段、4字节的 int 型的 hash 字段、4字节的空白填充(为了对齐)还有 HashMap 中对这个 Entry 的 8 字节的引用,这样实际占用的内存为:(Long(24byte) * 2) + Entry(32byte) + HashMap Ref(8byte)=88byte,空间效率仅仅为 16byte / 88byte = 18%。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cdh cm界面HDFS爆红:不良 : 该 DataNode 当前有 1 个卷故障。 临界阈值:任意。(Linux磁盘修复)

一、表现 1.cm界面 报错卷故障 检查该节点&#xff0c;发现存储大小和其他节点不一致&#xff0c;少了一块物理磁盘 2.查看该磁盘 目录无法访问 dmesg检查发现错误 dmesg | grep error二、解决办法 移除挂载 umount /data10 #可以移除挂载盘&#xff0c;或者移除挂载目…

WPS的bug问题(解决方法->换成office吧):表格数据和透视图数据不一致问题,多次尝试确定该bug

1.软件版本 2.问题描述 我在原始表中对其中一列进行筛选&#xff0c;选择95%以上这个选项值&#xff0c;343个数据。 在筛选了95%以上这个选项之后&#xff0c;我的另一列的值全部是no&#xff0c;343个数据。 然后进行透视图之后&#xff0c;在绘制的图形中发现&#xff0c…

怎么压缩图片200k以下?压缩图片到指定大小

在工作中&#xff0c;会遇到在某些系统要上传照片&#xff0c;但是对于上传的照片大小有限制&#xff0c;比如限制大小不能超过200KB等&#xff0c;而外业拍摄的照片往往会超过限制的大小&#xff0c;那么这时就需要对照片进行压缩。尤其是我们在面对大量图片需要处理的时候&am…

一周IT资讯

又降了&#xff1f;运维4月平均月薪1W6&#xff1f; 薪资作为大部分人的主要收入来源&#xff0c;是每个人最关注的话题之一。 最近&#xff0c;小编搜索了近半年的运维薪资趋势&#xff0c;看看你的钱包缩水了没&#xff1f; *数据来自看准网 据了解&#xff0c;运维2024年…

Python 爬虫如何配置代理 IP (Py 采集)

在Python中配置代理IP&#xff0c;可以通过设置requests库的proxies参数来实现。以下是一个示例&#xff1a; import requests# 则立可以获取稳定代理Ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg # 推荐使用私密动态 IP proxies {"http": "ht…

Pulsar 社区周报 | No.2024-04-19 | Pulsar Meetup 深圳 2024 邀您报名

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;周五发布。 ” Pulsar Meetup 深圳 2024 Pulsar Meetup 深圳 2024 将于 2024 年 4 月 27 日 周六举办&#xff0c;此次活动由 AscentStream 谙&a…

HR招聘测评,人才测评的方法有哪些?

各企业都需要人才&#xff0c;如果招聘不到合适的人才&#xff0c;就会对自身的发展带来极大的限制&#xff0c;很难找到自己的一席之地。一个优秀的人才&#xff0c;通常会成为许多公司争先哄抢的对象&#xff0c;在招聘过程中会成为一个香饽饽。但是要选出一个优秀的人才&…

戴尔电脑怎么关闭开机密码?

1.同时按键盘上是“window键”&#xff08;一般是键盘最下面一排第二个&#xff09;和“R键“&#xff0c;并在弹出的窗口输入“netplwiz”然后确定。 2.然后会弹出的“用户账户”窗口&#xff0c;接下来取消勾选“要使用本计算机&#xff0c;用户必须输入用户名和密码” 3.上面…

C语言---贪吃蛇(一)---准备工作

文章目录 前言1.Win32 API介绍1.1.Win32 API1.2. 控制台程序1.3.控制台屏幕上的坐标[COORD](https://learn.microsoft.com/zh-cn/windows/console/coord-str)1.4.[GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5.[GetConsoleCursorInfo](h…

运动想象 (MI) 分类学习系列 (9) :FBCNet

运动想象分类学习系列:FBCNet 0. 引言1. 主要贡献2. 提出的方法2.1 滤波器组卷积网络2.2 方差层结构介绍 3. 实验结果3.1 基线方法比较3.2 方差层对结果的影响3.3 脑卒中患者在相关模型中观察到更大的受试间变异性 4. 总结欢迎来稿 论文地址&#xff1a;https://arxiv.org/abs/…

详细UI色彩搭配方案分享

UI 配色是设计一个成功的用户界面的关键之一。UI 配色需要考虑品牌标志、用户感受、应用程序的使用场景&#xff0c;这样可以帮助你创建一个有吸引力、易于使用的应用程序。本文将分享 UI 配色的相关知识&#xff0c;帮助设计师快速构建 UI 配色方案&#xff0c;以满足企业的需…

什么是IoT?

什么是IoT&#xff1f; IoT&#xff0c;即物联网&#xff08;Internet of Things&#xff09;&#xff0c;是通过信息传感设备和互联网将各种物品连接起来&#xff0c;实现智能化的识别、定位、跟踪、监控和管理的网络系统。 以下是关于IOT的一些详细解释&#xff1a; 基本概…

【RAG 论文】面向知识库检索进行大模型增强的框架 —— KnowledGPT

论文&#xff1a;KnowledGPT: Enhancing Large Language Models with Retrieval and Storage Access on Knowledge Bases ⭐⭐⭐⭐ 复旦肖仰华团队工作 论文速读 KnowledGPT 提出了一个通过检索知识库来增强大模型生成的 RAG 框架。 在知识库中&#xff0c;存储着三类形式的知…

记录一下flume中因为taildir_position.json因位置不对导致数据无法从kafka被采到hdfs上的问题

【背景说明】 我需要用flume将kafka上的数据采集到hdfs上&#xff0c;发现数据怎么到不了hdfs。 【问题排查】 1.kafka上已有相应的数据 2.我的flume配置文档&#xff08;没问题&#xff09;&#xff0c; 3.时间拦截器&#xff08;没问题&#xff09;&#xff0c; 4.JSONObje…

DNS域名系统(Domain Name System)基础知识

目录 1.定义 2.DNS系统组成 3.DNS系统作用 4.域名系统命名规则 5.记录类型 6.DNS查询过程 7.DNS查询方式 8.DNS文件 1.定义 DNS系统是一个分布式的主机信息数据库&#xff0c;采用客户机/服务器模式。 域名系统&#xff08;英文&#xff1a;Domain Name System&#xf…

Python中的设计模式与最佳实践

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的设计模式与最佳实践 在软件开发中&#xff0c;设计模式是一种解决常见问题的经过…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT&#xff08;JSON Web Token&#xff09;和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证&#xff1a;无状态。服务器生成一个令牌&#xff0c;客户端存储该令牌并随每个请求一起提供&#xff0c;服务端仅需按照…

椭圆曲线密码学(ECC)基本介绍和总结

背景 ECC英文全称"Elliptic Curve Cryptography"&#xff0c;其背后的密码学原理或者说安全性&#xff0c;是基于椭圆曲线离散对数问题&#xff08;Elliptic Curve Discrete Logarithm Problem&#xff0c;ECDLP&#xff09;。ECC密码学被普遍认为是RSA密码系统的接…

有线通信--一文弄懂SPI--(基础篇)

学完很久的通信协议具体内容总是忘记&#xff0c;为了方便自己随时复习以及查看&#xff0c;本人这里总结一份关于SPI的协议详解&#xff0c;分享给大家。 一、什么是SPI 每接触一个协议,我们都要明白它的优缺点&#xff0c;知道它的使用范围和特点&#xff0c;在有这些前置认…

lftp客户端

设置编码 当使用FTP客户端&#xff0c;尤其是命令行界面时&#xff0c;可能会遇到文件名字符集不匹配导致的乱码问题。这通常是因为服务器和客户端使用的编码方式不同&#xff0c;比如一个使用UTF-8&#xff0c;而另一个使用ISO-8859-1或GBK等。 在Linux系统中&#xff0c;如果…
最新文章