猿辅导Java面试真实经历与深度总结(三)

作者:360_go_php日期:2025/10/23

在Java面试中,有些问题是每个面试官几乎都会问到的。这些问题涉及到JVM内存管理、Spring框架的核心原理以及一些常见的Java技术点。今天我们来解答一系列常见的Java面试问题,帮助你更好地准备面试。


1. JVM内存区域及内存溢出

JVM内存分为多个区域,每个区域有不同的功能。主要分为以下几个区域:​编辑

  • 程序计数器(Program Counter Register):每个线程有独立的程序计数器,用于指示当前线程所执行的字节码指令的位置。
  • Java虚拟机栈(JVM Stack):每个线程有一个私有的栈,用于存储局部变量、方法调用信息、方法的返回值等。栈是按方法调用的顺序创建的,它是线程私有的。栈内存溢出通常会出现StackOverflowError,通常是递归调用过深导致栈空间不足。​编辑
  • 本地方法栈(Native Method Stack):类似于虚拟机栈,用于存储本地方法的调用信息,通常在使用JNI(Java Native Interface)时使用。​编辑
  • (Heap):堆是JVM中最大的一块内存区域,用于存储对象实例和数组。堆内存溢出通常会出现OutOfMemoryError。如果JVM无法为新创建的对象分配足够的内存,就会抛出该异常。堆是所有线程共享的。
  • 方法区(Method Area):用于存储类信息、常量、静态变量、方法等。方法区在JVM中也称为永久代(Metaspace)。方法区的内存溢出会抛出OutOfMemoryError: PermGen space(在JDK 8以后,永久代被元空间(Metaspace)替代)。
  • 运行时常量池(Runtime Constant Pool):是方法区的一部分,用于存储类加载时的常量和符号引用。

什么时候会发生内存溢出?

  • 栈溢出(StackOverflowError):通常是因为栈深度过深,比如递归调用过多导致栈空间耗尽。
  • 堆溢出(OutOfMemoryError):通常是因为程序创建了过多的对象,导致JVM无法为新对象分配内存。

2. 堆区的垃圾回收机制,为什么要使用分代策略?​编辑

垃圾回收机制:JVM的垃圾回收器(GC)负责自动回收无用对象,从而避免内存泄漏和提高内存利用率。

分代垃圾回收策略:JVM将堆分为三个区域:年轻代(Young Generation)、老年代(Old Generation)和永久代(Metaspace)。分代策略的核心思想是不同生命周期的对象具有不同的回收频率和回收方式。这样做的原因如下:

  • 年轻代:新创建的对象大多数会很快变得不可达,因此可以频繁地进行垃圾回收。年轻代通常采用复制算法进行回收。
  • 老年代:存活时间较长的对象,垃圾回收的频率相对较低,因此回收策略会更加高效。老年代通常采用标记-清除标记-整理算法。

分代策略能够提高GC效率,减少频繁的垃圾回收对系统性能的影响。


3. 为什么老年代不采用复制算法?

复制算法:复制算法的核心思想是将存活的对象从一个区域复制到另一个区域。复制算法的优点是简单、效率高,但缺点是需要将对象复制到新区域,空间利用率较低。

对于年轻代,复制算法适用,因为年轻代对象的生存时间较短,大部分对象会很快成为垃圾,因此可以通过复制算法来高效清理。

然而,老年代中的对象存活时间较长,复制算法不适用,因为:

  • 对象数量较多:老年代中的存活对象较多,复制会浪费大量内存和时间。
  • 空间利用率低:老年代对象的分布不均,复制算法会导致空间浪费,影响内存的使用效率。

因此,老年代通常采用标记-清除标记-整理算法,这些算法在回收过程中不需要将存活的对象复制到其他区域,从而避免了浪费。


4. SpringBoot自动装配的原理​编辑

自动装配(Autowiring)是Spring框架的一个重要特性,SpringBoot进一步简化了自动装配的配置。

SpringBoot的自动装配原理基于条件化装配@Conditional注解)和组件扫描@ComponentScan注解)。其核心机制是:

  • @EnableAutoConfiguration注解:该注解是Spring Boot自动装配的核心。它通过扫描类路径下的META-INF/spring.factories文件来加载各种自动装配类。
  • @Autowired注解:Spring Boot通过@Autowired自动注入依赖对象,自动选择适合的Bean进行注入。
  • 自动配置类:Spring Boot内置了大量的自动配置类,这些配置类会根据当前的环境和类路径中的库来自动进行配置。

5. Spring中AOP是如何实现的?

**AOP(面向切面编程)**是Spring框架的一个重要功能,它允许开发者在不修改源代码的情况下,增加程序的横切关注点(例如日志、事务管理等)。​编辑

Spring中的AOP实现依赖于代理模式,有两种常见的方式:

  • JDK动态代理:当目标类实现了接口时,Spring会使用JDK动态代理生成一个代理类,代理类实现目标类的接口,并在方法调用时织入增强逻辑。
  • CGLIB代理:如果目标类没有实现接口,Spring会使用CGLIB(一个字节码生成库)来生成目标类的子类,在子类方法中织入增强逻辑。

Spring AOP通过代理模式来实现方法的拦截和增强,常见的AOP注解包括@Aspect@Before@After@Around等。​编辑


6. Cglib和JDK的动态代理有什么区别?

  • JDK动态代理:只支持接口代理,代理对象必须实现一个或多个接口。通过java.lang.reflect.Proxy类来实现。
  • CGLIB代理:通过生成目标类的子类来实现代理,目标类不需要实现接口。CGLIB代理依赖于Enhancer类来生成子类。

区别总结

  • JDK代理适用于有接口的类,CGLIB代理适用于没有接口的类。
  • CGLIB代理可能会增加类加载的复杂性,且无法代理final方法和final类。

7. Spring是如何实现IoC的?

**IoC(控制反转)是Spring框架的核心特性之一,Spring通过依赖注入(DI)**来实现IoC。其基本思想是:对象的创建和依赖关系由Spring容器来管理,而不是由应用程序代码来控制。

​编辑Spring的IoC实现基于以下几种方式:

  • 构造函数注入:通过构造函数注入依赖对象。
    ​编辑
  • Setter注入:通过JavaBean的Setter方法注入依赖对象。
  • 接口注入:通过接口注入依赖对象。

Spring IoC的实现依赖于BeanFactoryApplicationContext。容器通过配置文件或注解来扫描和注册Bean,并通过反射机制将Bean实例化,并自动注入所需的依赖。​编辑


总结

这些问题涵盖了Java面试中一些重要的核心知识点,包括JVM内存管理、Spring框架原理、AOP、IoC等。掌握这些知识点,可以帮助更好地理解Java及其相关技术,并提高在面试中的竞争力。


猿辅导Java面试真实经历与深度总结(三)》 是转载文章,点击查看原文


上一篇:c++算法题目总结

下一篇:http 状态码

相关推荐


3个技巧让你彻底搞懂JavaScript异步编程
良山有风来2025/10/22

你是不是曾经遇到过这样的情况? 页面上的数据加载了半天就是出不来,控制台报了一堆看不懂的错误。代码写着写着就变成了“回调地狱”,一层套一层,自己都看不懂自己写了什么。 别担心,异步编程确实是很多前端开发者的痛点。但今天,我会用最通俗易懂的方式,带你彻底搞懂JavaScript中的异步编程。 读完本文,你不仅能理解回调、Promise和async/await的区别,还能掌握如何在实际项目中优雅地处理异步操作。最重要的是,你会拥有一套清晰的异步编程思路,再也不用害怕处理复杂的异步逻辑了。 什么是异步


基于SpringBoot的高校迎新管理系统
计算机毕设定制辅导-无忧2025/10/20

一、前言         随着高等教育规模的持续扩大和信息化建设的不断推进,传统高校迎新工作面临着流程繁琐、信息分散、效率低下和管理混乱等挑战。人工办理报到手续、纸质材料收集与核对不仅耗时耗力,还容易出现差错,给新生、家长及迎新工作人员带来诸多不便,难以满足现代化高校管理的需求。         为提升迎新工作的组织效率与服务质量,本文设计并实现一套基于SpringBoot的高校迎新管理系统。系统采用SpringBoot框架构建稳定、高效的后端服务,利用Vue.js开发响应迅速、交互友好


MYSQL学习笔记(个人)(第十五天)
chenzhou__2025/10/19

自学《数据库系统原理与应用》——— 黄宝贵、马春梅、禹继国 —— 清华大学出版社 关系规范化理论: 关系规范化的作用:         为了设计一个合理、可靠、简单、正确的关系数据库,形成了关系规范化理论。其包括两个方面的内容:1.数据依赖,研究属性之间的依赖关系;2.范式,是关系模式符合某种级别的标准。 1.问题的提出: 下面有个关系模式: SCD(sno, sname, dname, office, cno, cname, score) 其中按照现实需求和实际应用,可得语义: (


[嵌入式系统-136]:主流AIOT智能体软件技术栈
文火冰糖的硅基工坊2025/10/18

主流AIoT(人工智能物联网)智能体软件技术栈涵盖了硬件、通信、AI算法、安全防护等多个层面,其核心在于通过“感知-分析-决策-执行”的闭环架构,将物联网的连接能力与人工智能的认知能力深度融合。以下从技术架构、关键技术栈、应用场景三个维度进行解析: 一、技术架构:分层解耦与闭环控制 AIoT智能体的技术架构通常分为四层,每层承担特定功能并协同工作: 感知层 功能:通过传感器和终端设备采集环境数据(如温度、湿度、图像、声音等)。关键技术: 传感器技术:高精度、低功耗的传感器(


C#设计模式源码讲解
小张9992025/10/16

C#设计模式源码合集,包含23种设计模式完整源码,每个模式都有详细注释和实例代码。 不想打螺丝,转行做架构师       功能亮点: 1.创建型模式5种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式 2.结构型模式7种:适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式 3.行为型模式11种:策略模式、迭代器模式、中介者模式、观察者模式、状态模式、模板方法模式、命令模式、职责链模式、访问者模式、解释器模式、备忘录模式 4.每个模式都配有详细注释和实


告别JS初学者噩梦:这样写流程控制和函数才叫优雅
良山有风来2025/10/15

你是不是也遇到过这样的场景? 面对一堆复杂的if-else嵌套,自己都看不懂昨天写的代码;想要复用某个功能,却只能笨拙地复制粘贴;代码越写越长,bug越改越多,最后连自己都不想维护... 别担心,今天这篇文章就是来拯救你的! 我将带你重新认识JavaScript的流程控制和函数封装,分享一些让代码变得更优雅、更易维护的实用技巧。读完本文,你将彻底告别“面条式代码”,写出既漂亮又实用的JavaScript代码。 流程控制:从混乱到清晰 先来看个真实案例。假设我们要根据用户等级显示不同的权益: //


无Dockerfile构建:云原生部署新姿势
10岁的博客2025/10/14

容器化安装新玩法:无 Dockerfile 构建与多环境部署 创新点解析 Buildpacks 免 Dockerfile 构建 通过云原生构建包自动分析代码类型(Python/Node.js/Java等)动态生成最优容器镜像,无需手动编写 Dockerfile示例命令:pack build my-app --builder=gcr.io/buildpacks/builder:v1 Kubernetes 多环境热切换 使用 Kustomize 实现同一应用的多环境配置覆盖环境差异抽象为覆盖


如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
IT橘子皮2025/10/12

基于 Spring Cloud Gateway 实现灰度发布,核心思路是通过定义路由规则,将特定流量导向新版本服务。下面我用一个表格汇总主要策略,然后提供具体配置示例和关键说明。 🎯 灰度发布策略概览 策略类型核心机制适用场景​基于请求头 (Header)​​检查请求头中的特定标识(如 X-Gray-Release: true)内部测试、指定体验用户​基于权重 (Weight)​​按配置的百分比随机分配流量到不同版本A/B测试、逐步放量​基于用


Go语言实战案例——进阶与部署篇:使用Docker部署Go服务
程序员爱钓鱼2025/10/11

在现代软件开发中,应用的可移植性和环境一致性至关重要。无论是在开发环境、测试环境还是生产环境,我们都希望 Go 项目能够快速部署、稳定运行。而 Docker 正是实现这一目标的关键工具。 本文将带你从零开始,实战演示如何使用 Docker 构建并部署一个 Go Web 服务。通过这个案例,你将学会将 Go 应用打包成轻量级容器镜像,并在任何地方一键运行。 一 为什么使用 Docker 部署 Go 服务 在未使用 Docker 之前,部署 Go 项目通常需要以下步骤: 1 安装 Go 环境 2


一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!
追逐时光者2025/10/9

前言 在多设备协同日益普及的今天,高效、流畅的远程控制已成为工作与生活的刚需。网易出品的这款免费远程控制软件,凭借低延迟、高画质与跨平台兼容性,轻松实现手机、平板、Mac、PC、TV 乃至掌机对电脑的远程操控,让自由办公与畅快娱乐触手可及。 工具介绍 网易UU远程是一款由网易出品的专业远程控制软件。支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑,满足远程游戏、办公和协助需求。凭借高速直连和超低延迟,提供流畅的本地操控体验,支持真彩、 HDR 、4K、144 帧画面显示,支持远程开

上一篇:c++算法题目总结

下一篇:http 状态码

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0