版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java高级高频面试题及详细真实答案(实战向)一、JVM核心面试题1.说一下JVM的内存区域划分,以及各区域的作用、是否线程安全、OOM场景JVM运行时数据区分为线程私有和线程共享两大块,是工作中排查内存问题的核心基础,具体划分和细节如下:1)线程私有区域(随线程创建销毁,线程安全)程序计数器:记录当前线程执行的字节码行号,用于线程切换后恢复执行。是唯一没有OOM的内存区域,无内存溢出风险。虚拟机栈:存储方法栈帧,包含局部变量表、操作数栈、动态链接、方法出口等。每个方法执行对应一个栈帧入栈,方法结束栈帧出栈。
OOM/异常场景:栈深度超过虚拟机限制抛出StackOverflowError;线程栈内存分配不足抛出OutOfMemoryError。本地方法栈:作用和虚拟机栈类似,专门用于执行native本地方法。同样会出现栈溢出和内存溢出问题。2)线程共享区域(全局共享,线程不安全)堆内存:所有对象实例、数组的唯一存储区域,是GC回收的核心区域,分为新生代、老年代。
OOM场景:大量创建对象、内存泄漏、堆内存参数设置过小,触发Javaheapspace溢出。方法区(元空间):JDK8之前是永久代,JDK8及之后改为元空间,存储类信息、常量、静态变量、即时编译代码。
OOM场景:动态生成大量类、频繁热部署、加载过多第三方类,触发元空间溢出。2.详细说说CMS和G1垃圾收集器的区别,生产环境如何选择CMS和G1是生产中最常用的两款垃圾收集器,核心差异在设计思路、停顿时间、适用场景,没有绝对优劣,看业务需求选择:CMS(并发标记清除收集器)设计目标:追求低延迟,减少老年代GC停顿时间执行流程:初始标记(STW)→并发标记→预清理→最终标记(STW)→并发清除→并发重置缺点:采用标记清除算法,会产生大量内存碎片;并发阶段占用CPU资源;无法处理浮动垃圾,可能出现ConcurrentModeFailure导致退化为FullGC适用场景:JDK8及之前、堆内存不大(8G以内)、对停顿时间敏感的业务G1(分区收集器)设计目标:兼顾低延迟和高吞吐量,可控的GC停顿时间核心特点:将整个堆划分为多个大小相等的Region分区,可单独回收新生代、老年代分区,支持混合GC执行流程:初始标记→并发标记→最终标记→筛选回收(STW)优势:内存碎片少、停顿时间可控、超大堆适配性好;缺点:内存占用和CPU开销略高于CMS适用场景:JDK9+默认收集器、堆内存8G以上、需要严格控制GC停顿时间的中大型项目生产选择原则:小堆、老业务JDK8选CMS;大堆、新业务、对延迟要求极高选G1;JDK17+直接使用ZGC,性能远超G1。3.什么是内存泄漏?常见的Java内存泄漏场景及排查思路内存泄漏定义:程序中已经不再使用的对象,因为存在引用链路无法被GC回收,持续占用堆内存,最终导致内存溢出。常见泄漏场景静态集合类:static修饰的List、Map全局存储对象,对象生命周期和项目一致,无法释放未关闭资源:IO流、数据库连接、Redis连接、线程连接池未正常关闭匿名内部类/线程:内部类持有外部类引用,异步线程长期运行持有对象引用缓存滥用:本地缓存无过期策略、无淘汰机制,数据无限堆积ThreadLocal使用不当:使用后未remove,线程复用导致对象残留排查流程:线上告警发现OOM→导出heapdump快照→使用MAT、JProfiler分析大对象、泄漏对象→定位引用链路→查看代码引用逻辑→修复代码并压测验证。二、Java并发编程核心面试题1.Synchronized和Lock的区别?底层原理是什么?这是并发高频核心题,二者都是解决线程安全的锁机制,底层实现和使用场景差异很大:1)核心区别实现方式:synchronized是JVM底层原生锁,基于字节码monitor实现;Lock是Java代码层面的锁,基于AQS队列实现锁特性:synchronized是隐式锁,自动加锁释放锁;Lock是显式锁,需要手动lock()、unlock()灵活性:Lock支持可中断锁、超时锁、读写锁、公平/非公平锁;synchronized仅支持非公平锁,功能单一性能:JDK1.6之后synchronized做了偏向锁、轻量级锁优化,性能和Lock基本持平,低并发下更优2)底层原理synchronized:基于对象头的MarkWord和Monitor监视器,无竞争时偏向锁,轻微竞争轻量级锁(CAS),激烈竞争升级为重量级锁(阻塞等待)Lock(ReentrantLock):基于AQS抽象队列同步器,通过volatile修饰的state变量记录锁状态,CAS抢占锁,失败则进入双向阻塞队列排队,唤醒后重试抢占使用场景:简单同步场景优先用synchronized;需要读写分离、锁超时、可中断场景用ReentrantLock。2.什么是AQS?核心原理和组成是什么?AQS是Java并发包的核心基础框架,全称抽象队列同步器,JUC下所有锁和同步工具(ReentrantLock、CountDownLatch、Semaphore)底层都依赖AQS实现。核心组成state状态变量:volatile修饰的int变量,核心标识,不同场景含义不同。ReentrantLock中代表锁重入次数,CountDownLatch中代表剩余计数双向阻塞队列:存储抢占锁失败的线程,线程入队后阻塞,等待前驱节点释放锁后唤醒模板方法:提供tryAcquire、tryRelease、tryAcquireShared等可重写方法,子类根据需求实现独占/共享锁逻辑核心流程:线程尝试通过CAS修改state抢占锁→成功则直接执行→失败则封装为Node节点加入队列→自旋阻塞等待→前驱节点释放锁后唤醒当前线程→再次尝试抢占锁。3.线程池核心参数、工作原理,为什么不推荐使用Executors创建线程池1)线程池七大核心参数corePoolSize:核心线程数,线程池常驻线程,空闲不回收maximumPoolSize:最大线程数,任务过多时扩容的上限keepAliveTime:非核心线程空闲超时时间,超时自动回收unit:超时时间单位workQueue:任务阻塞队列,存储等待执行的任务threadFactory:线程工厂,创建线程,可自定义线程名、优先级handler:拒绝策略,任务队列和线程数都满时触发2)工作原理提交任务后,优先创建核心线程执行→核心线程满则任务进入队列→队列满则创建非核心线程→线程数达到最大值且队列已满,触发拒绝策略。3)不推荐Executors的原因Executors创建的线程池参数默认,存在线上风险:newFixedThreadPool、newSingleThreadExecutor使用无界队列,任务堆积会导致OOM;newCachedThreadPool最大线程数无限制,高并发下会创建大量线程,导致CPU打满、系统卡死。生产必须手动通过ThreadPoolExecutor创建线程池。三、Java集合核心面试题1.HashMap底层原理?JDK1.7和JDK1.8的区别?为什么线程不安全底层核心原理:HashMap基于数组+链表+红黑树实现,通过hash算法计算key的索引位置存储数据,默认初始容量16,负载因子0.75,容量达到阈值触发扩容。JDK1.7与1.8核心区别数据结构:1.7是数组+单向链表;1.8新增红黑树,链表长度≥8且数组容量≥64时树化,链表长度≤6退化为链表hash算法:1.8优化hash扰动算法,减少哈希冲突扩容机制:1.7扩容会重新计算所有索引,存在链表头尾倒置、循环链表问题;1.8通过高位低位拆分链表,保留原有顺序,无循环问题插入方式:1.7头插法;1.8尾插法线程不安全原因:多线程同时put数据会导致数据覆盖;JDK1.7多线程扩容会形成循环链表,触发死循环CPU飙高;多线程并发扩容、修改,无法保证数据一致性。并发场景推荐使用ConcurrentHashMap。2.ConcurrentHashMap底层原理,如何保证线程安全JDK1.8ConcurrentHashMap核心原理:采用数组+链表+红黑树,摒弃1.7的分段锁,使用CAS+synchronized保证并发安全,锁粒度细化到数组单个节点,并发性能大幅提升。线程安全保障机制空桶位置:通过CAS无锁插入数据,不阻塞线程已有数据节点:对当前数组头节点加synchronized锁,只锁定当前哈希槽,不影响其他槽位并发操作volatile修饰数组和节点value:保证多线程间内存可见性,禁止指令重排扩容、树化、迁移逻辑均加锁控制,避免并发冲突同时不支持key、value为null,避免空指针歧义,相比HashMap更严谨适配并发场景。四、Spring核心面试题1.SpringIOC原理、Bean的生命周期IOC核心思想:控制反转,将对象的创建、依赖注入、生命周期管理交给Spring容器管理,摆脱代码硬编码依赖,实现解耦,配合DI依赖注入完成对象装配。完整Bean生命周期资源加载、扫描配置类/注解,解析Bean定义信息Bean实例化:通过反射创建Bean对象属性填充:完成依赖注入(@Autowired、set方法、构造器注入)前置处理:执行BeanPostProcessor前置初始化方法初始化:执行InitializingBean、@PostConstruct自定义初始化方法后置处理:执行BeanPostProcessor后置初始化方法Bean完成初始化,放入单例池,供业务调用容器关闭时,执行DisposableBean、@PreDestroy销毁方法2.SpringAOP原理、常用通知类型、应用场景AOP核心原理:面向切面编程,基于动态代理机制,在不修改原有业务代码的前提下,对方法进行增强,实现日志、事务、权限等通用功能的解耦。SpringAOP默认优先使用JDK动态代理(接口代理),无接口则使用CGLIB字节码代理。常用通知类型前置通知@Before:方法执行前触发后置通知@After:方法执行完毕(无论是否异常)触发返回通知@AfterReturning:方法正常返回后触发异常通知@AfterThrowing:方法抛出异常后触发环绕通知@Around:包裹方法执行,可自定义前后逻辑、控制方法执行应用场景:统一日志记录、接口耗时统计、权限校验、事务控制、限流熔断、参数校验。3.Spring事务传播机制、隔离级别,事务失效场景1)七大事务传播机制(核心常用)REQUIRED(默认):有事务则加入,无事务新建事务SUPPORTS:有事务则加入,无事务非事务运行MANDATORY:必须在事务内运行,无事务直接报错REQUIRES_NEW:新建独立事务,挂起当前已有事务NESTED:嵌套事务,依赖父事务,父事务回转子事务全部回滚2)四大隔离级别READ_UNCOMMITTED:读未提交,存在脏读、不可重复读、幻读READ_COMMITTED(默认):读已提交,解决脏读,存在不可重复读、幻读REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读SERIALIZABLE:串行化,解决所有并发问题,性能最低3)常见事务失效场景方法非public修饰,Spring无法生成代理同类中方法内部调用(this调用),绕过代理对象,事务不生效异常类型错误:默认只捕获RuntimeException,普通Exception不会回滚手动捕获异常未抛出,事务无法感知异常数据库引擎不支持事务(MyISAM)五、MySQL高级面试题1.InnoDB索引原理,B+树为什么比B树、哈希索引适合MySQLInnoDB默认使用B+树作为索引结构,是适配磁盘存储和查询场景的最优结构:B+树优势对比对比B树:B+树所有数据都在叶子节点,非叶子节点只存索引键,层级更少、磁盘IO次数更少;叶子节点双向链表串联,支持范围查询、排序、分页,B树仅支持精准查询对比哈希索引:哈希索引不支持范围查询、排序、模糊查询,存在哈希冲突;B+树查询稳定、支持所有查询场景,适配MySQL绝大多数业务InnoDB索引特点:聚簇索引为主键索引,叶子节点存储整行数据;二级索引叶子节点存储主键值,查询需要回表。2.慢SQL优化思路,索引失效场景有哪些完整慢SQL优化流程开启慢日志→抓取慢SQL→explain分析执行计划→定位索引、关联、分页问题→优化SQL、调整索引→压测验证效果。常见索引失效场景索引列使用函数、运算、类型转换(如date()、+、字符串数字混用)like前置模糊查询(%xxx),后置模糊(xxx%)不失效or连接无索引字段,导致整体索引失效违反最左匹配原则(联合索引)null值判断、notin、notexists大概率失效索引MySQL优化器判断全表扫描比索引查询更快,自动放弃索引3.MySQL事务四大特性、MVCC原理事务四大ACID特性原子性:事务要么全部成功,要么全部回滚一致性:事务前后数据完整性一致隔离性:多事务并发执行互不干扰持久性:事务提交后数据永久落地,宕机不丢失MVCC多版本并发控制原理MVCC是InnoDB实现读写不加锁、提升并发性能的核心,通过数据多版本解决读写冲突,支撑可重复读隔离级别。核心依赖:隐藏字段(事务ID、回滚指针)、undolog日志、readview读视图。执行流程:读数据时生成readview,通过比对数据版本的事务ID,判断数据是否可见,不可见则通过回滚指针从undolog读取历史版本数据,实现无锁读。六、Redis高级面试题1.Redis缓存穿透、击穿、雪崩解决方案1)缓存穿透:查询数据库和缓存都不存在的数据,大量请求直接打穿数据库解决方案:缓存空值、布隆过滤器拦截非法key、接口层参数校验、限流拦截。2)缓存击穿:热点key过期瞬间,大量并发请求直接访问数据库解决方案:热点key永不过期、分布式锁(Redisson)、互斥锁重建缓存。3)缓存雪崩:大量key同时过期/Redis宕机,所有请求直达数据库,导致数据库压力雪崩解决方案:过期时间加随机值打散过期时间、搭建Redis集群高可用、多级缓存、服务熔断降级、限流。2.Redis持久化机制RDB和AOF区别,生产如何选择RDB(快照持久化):定时将内存全量数据快照写入磁盘,二进制文件,体积小、恢复快。优点:性能高、文件小、恢复速度快;缺点:会丢失最后一次快照后的增量数据,数据完整性差。AOF(日志持久化):记录每一条写操作命令,追加到日志文件,文本格式。优点:数据几乎不丢失、安全性极高;缺点:文件体积大、恢复速度慢、性能略低。生产选择:数据不敏感、追求性能用纯RDB;数据绝对不能丢失用纯AOF;主流生产环境开启RDB+AOF混合持久化,兼顾性能和数据安全。3.分布式锁实现原理,Redisson可重入锁原理Redis分布式锁核心原理:通过setkeyvalue
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车环保建档检测站项目可行性研究报告
- 社区养老日间照料管理制度
- 自动化仪表工程竣工验收报告
- 医疗辅助人员岗位规范年度考核方案
- 养老机构食品留样管理制度
- 小微工厂能耗管控方案
- 智能冰点保鲜库项目建设方案
- 热水管道直埋敷设培训
- 2026年考研英语数学一线性代数通关试卷
- 2026年汽车后市场行业报告:线上线下服务网络拓展与品牌建设
- 2026年北京市中小学生天文观测竞赛选则题及答案
- 2026年中考数学:圆的相关概念和基本性质(知识解读+例题讲义)原卷版
- 金寨县扶贫产业差异化发展毛竹资源利用分析详细报告
- 2026年陕西交安c考试题及答案
- 中国胃肠道肿瘤双镜联合手术临床实践指南解读
- 基于纳米材料的菌体抗原检测技术-洞察与解读
- 2026年四川省书法考级题库及解析
- 2026年眼耳鼻喉定期考核考试题库(历年真题)附答案详解
- 中央空调工艺考核制度
- 运动损伤讲解课件
- DB13∕T 6056-2025 涉路工程技术评价规范
评论
0/150
提交评论