面试视频 笔记

276 阅读12分钟

用户反馈, 再去用链路追踪工具 skywalking

线程池

Springboot

@SpringbootApplication

@SpringBootConfiuration : 等价于 @Configuration

@ComponentScan: 组件扫描,默认扫描当前类的引导类所在包及其子包

@EnableAutoConfiguration: SpringBoot实现自动化配置的核心注解

其中的 @Import 注解导入对应的配置选择器. 选择器去读取当前项目以及项目引用Jar包下面的classpath路径下META-INF/spring.factories文件中所配置的类的类名.在这些配置类中所定义的bean会根据条件注释指定的条件来决定是否需要将其导入到Spring容器中.

条件判断会有像 @ConditionalOnClass 这样的注解,判断是否有对应的class文件,如果有则加该类,把这个配置类的所有Bean放入spring容器中使用

@ConditionalOnMissingBean

导师+ 2 + 应届生

前端2 + 测试1 服务端3

ES

ES

Spring

1. spring的bean是线程安全的吗?

不是线程安全的

image-20231220135253999

image-20231220135354706

image-20231220135801144

2. AOP

image-20231220162532671

image-20231220161924395

image-20231220162041030

image-20231220162435752

3. spring中事务失效的场景

  • 异常被捕捉
  • 抛出检查异常 非RuntimeException和 Error 可以使用 rollBackFor=Exception.class
  • 非 public 方法导致的事务失效 ,final
  • 在@transaction中 调用this的方法 没有被代理类增强

image-20231220163743460

image-20231220163842112

image-20231220164048190

4. spring事务

事务属性包括:

1. 隔离级别
2. 传播行为        7种
 - request   同用一个事务
 - Request_new   用不同的事务
 - Nested     用不同的事务,但会通知,如果外层事务将其捕获就不会回滚
3. 回滚规则
4. 是否只读
5. 事务超时

5. spring的Bean的生命周期

image-20231220175019787

image-20231220175434601

image-20231220175952063

6. 循环依赖

image-20231220180524044

image-20231220180707225

  • singletonObjects, 一级缓存
  • earlySingletonObjects, 二级缓存
  • singletonFactories 三级缓存

加入singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决 可以加@Lazy

二级缓存是用来存储 代理对象的?

三级缓存中的 objectFactories 能创建 普通对象和代理对象

对象不是代理对象的情况下

image-20231220212242443

image-20231220212632349

image-20231220212656399

image-20231220214417574

image-20231220214434840

7. springMvc 执行流程

  • JSP

image-20231220215024022

  • 前后端分离阶段(接口开发,异步请求)

image-20231220215131629

image-20231220215223048

image-20231220215306381

image-20231220220228731

8. Springboot的自动装配原理

image-20231220221003709

image-20231220221048442

image-20231220221154333

微服务

image-20231220222005195

SpringCloud

image-20231220230333352

image-20231220230359759

1. 注册中心

image-20231220233506752

image-20231220233605278

image-20231220233753495

image-20231220233944703

2. 负载均衡 Ribbon

image-20231220235909162

image-20231221000024938

image-20231221000047736

3. 限流

image-20231221000220457

image-20231221000323890

image-20231221000907272

image-20231221001038883

4. 如何监控微服务

image-20231221001317625

image-20231221002809583

image-20231221002844918

业务相关

image-20231221005016566

1. 限流的实现

image-20231221005220174

image-20231221134158871

image-20231221140020372

image-20231221142008188

2. CAP和BASE

image-20231221142713132

image-20231221143451000

image-20231221143505438

image-20231221142629447

image-20231221143906277

image-20231221143957138

3. 分布式事务解决方案?

image-20231221144619360

  • XA模式

image-20231221144741671

  • AT模式

image-20231221145029966

  • TCC模式

image-20231221145641166

  • MQ分布式事务

image-20231221145806218

image-20231221145939429

4. 接口的幂等性

image-20231221150100490

image-20231221150321229

image-20231221150525456

image-20231221150811859

5. 分布式任务调度

image-20231221152202077

image-20231221151205412

image-20231221151339178

image-20231221151544812

image-20231221151917637

消息中间件

RabbitMQ

消息不丢失

image-20231221152526317

image-20231221153029029

image-20231221153137600

image-20231221153335703

image-20231221153500528

image-20231221154310489

image-20231221154514504

image-20231221154941659

image-20231221155134170

image-20231221155149906

image-20231221160153737

image-20231221160205869

image-20231221160221728

image-20231221161812398

2. 消息堆积

image-20231221161948055

image-20231221162237735

3. 高可用

image-20231221162349818

image-20231221162743755

image-20231221163200025

image-20231221163242602

image-20231221163547249

Kafka

1. 如何保证消息不丢失

image-20231221165031153

image-20231221165107348

image-20231221165835873

image-20231221170004282

image-20231221170255772

image-20231221170726423

2. 如何保证消费的顺序性

image-20231222000657825

3. 分区备份机制

image-20231222000947625

image-20231222001303494

image-20231222001526085

4. kafka数据清理机制

image-20231222001936830

image-20231222002019409

image-20231222002122511

4.

image-20231222002823651

image-20231222002959804

集合框架

image-20231222125459111

image-20231222125522190

1. ArrayList

  • 成员变量

image-20231222142502354

  • 构造函数

image-20231222142655429

image-20231222151844926

image-20231222152221478

image-20231222150032009

image-20231222150111173

1. 如何实现数组与List之间的转换

image-20231222153336138

image-20231222160029913

2. LinkedList

image-20231222161925474

3. ArrayList和LinkedList的区别是什么?

image-20231222162044163

image-20231222162553420

image-20231222163026700

3. HashMap

  • 二叉树
  • 红黑树

为什么用红黑树,而不用平衡二叉树?

因为 作为动态树(需要添加和删除) , 红黑树的调整效率比平衡二叉树高!

image-20231222181019837

image-20231222181046525

image-20231222181104413

  • 散列表

image-20231222175810350

1. HashMap实现原理

image-20231222182101703

1.7 是头插法, 1.8 是尾插法,避免多线程下的循环链表问题

image-20231222182135057

image-20231222182325568

image-20231222190151410

2. put流程

image-20231222192145321

image-20231222192312332

3. 扩容原理

image-20231222194908005

image-20231222195047322

4. hashMap的寻址算法

image-20231222224508029

image-20231222224921980

image-20231222224944862

5. hashmap 在 1.7情况下的多线程死循环

image-20231222225609981

image-20231223003812897

并发编程

线程基础

1. 线程与进程的区别?

image-20231223005039708

image-20231223005053704

image-20231223005158161

2. 并行和并发有什么区别?

image-20231223010204096

image-20231223010321254

image-20231223010424765

image-20231223010706805

3. 创建线程的方式

  • 继承Thread类

image-20231223011341947

  • 实现runnable接口

image-20231223011405794

  • 实现Callable接口

image-20231223011514304

  • 线程池创建线程

image-20231223011644949

image-20231223011818283

runnable和callable有什么区别?

image-20231223012959950

run方法与start()方法的区别?

image-20231223013039651

image-20231223013100663

4. 线程包括哪些状态,状态之间是如何变化的

image-20231223013330775

image-20231223013501973

image-20231223013619864

5. 如何保证线程的顺序执行?

image-20231223013925997

notify()和notifyAll()有什么区别?

image-20231223014426310

6. wait和sleep方法的不同?

image-20231218151003449

如何停止一个正在运行的线程?

在线程中 定义一个 volatile boolean flag = false; 做标志

image-20231218151959190

线程中并发安全

1. Synchronized关键字的底层原理

image-20231218154623891

image-20231218154659668

image-20231218155403376

image-20231218162211913

image-20231218162451556

  • 轻量级锁

image-20231218163409492

image-20231218163435466

  • 偏向锁

image-20231218165027665

image-20231218165353577

2. JMM(java内存模型)

image-20231218165606625

image-20231218165727271

3. CAS

Compare And Swap

image-20231218170148355

image-20231218171805156

image-20231218171652289

4. 谈谈对volatile的理解

  • 保证线程间的可见性

image-20231218183313388

  • 禁止指令重排序

image-20231218184659406

image-20231218184557867

image-20231218184639703

5. 什么是AQS?

image-20231218185523924

image-20231218190854547

  • AQS是公平锁还是非公平锁

image-20231218191042967

image-20231218191209557

6.ReentrantLock的实现原理

image-20231218191853165

image-20231218191923669

image-20231218230853655

image-20231218230941345

7 synchronized和Lock有什么区别?

可打断,可超时,多条件变量

image-20231219001104624

8. 死锁产生的条件是什么?

image-20231219010003615

image-20231219010056259

image-20231219010108349

9. CurrentHashMap

image-20231219011010190

image-20231219011230084

image-20231219010816615

image-20231219010914147

10. Java程序中怎么保证多线程的执行安全(导致并发程序出现问题的根本原因是什么)

java并发编程三大特性

  • 原子性
  • 可见性
  • 有序性

image-20231219111434866

image-20231219112328945

image-20231219112427151

image-20231219112515880

image-20231219112627409

线程池

1.线程池的执行原理知道吗?

说一下线程池的核心参数

image-20231219113024184

image-20231219132938381

2. 线程池中有哪些常见的阻塞队列

image-20231219134027681

image-20231219134037113

3. 如何确定核心线程数

image-20231219134419307

image-20231219134455985

4. 线程池的种类有哪些?

image-20231219135338910

image-20231219135641254

image-20231219135851468

image-20231219140003994

image-20231219140110548

5. 为什么不建议使用Executors创建线程池?

image-20231219140331652

使用场景

1.线程池使用场景(CountDownLatch,Future)

  • CountDownLatch

image-20231219143926205

数据导入

2. 数据汇总

image-20231219144817375

3.异步调用

image-20231219145217858

4. 如何控制某个方法允许并发访问线程的数量

image-20231219150605018

5. ThreadLocal

image-20231219152627402

image-20231219152800096

image-20231219153030037

image-20231219151932286

image-20231219153152180

image-20231219152046311

设计模式

工厂模式

image-20231219185419451

  • 简单工厂

image-20231219190704030

  • 工厂方法模式

image-20231219193037929

image-20231219192214810

  • 抽象工厂模式

image-20231219193207630

image-20231219193349144

image-20231219193835170

image-20231219193941581

单例模式

策略模式

image-20231219170849511

image-20231219171305039

登录案例( 工厂模式+策略模式)

image-20231219184635572

策略模式+工厂: 实现多中登录方式

请求种带 type 表示请求类型.使用type去对应的工厂类中获取对应

在工厂内弄个map,调用aware接口去初始化 策略类

责任链设计模式

image-20231219211022993

image-20231219230305319

image-20231219230413035

常见技术场景

1.单点登录如何实现

image-20231219230846664

image-20231219231043484

image-20231219231107114

2. 权限认证如何实现

image-20231220001238236

image-20231220001319682

image-20231220001137880

image-20231220001348484

3. 上传数据的安全性你们怎么控制?

image-20231220115545674

image-20231220115645092

image-20231220115712044

image-20231220115756179

4. 你负载项目的时候遇到了哪些比较棘手的问题? 怎么解决的

image-20231220122135280

5. 你们项目中日志是怎么采集的

image-20231220122627560

image-20231220122921012

image-20231220122956889

image-20231220123522822

image-20231220123832334

6.生产问题如何排查

image-20231220125449364

image-20231220125510845

image-20231220125550375

image-20231220125615572

7. 如何快速定位系统的瓶颈

image-20231220130105531

image-20231220130522461

状态码

3XX 重定向

2XX 成功

  1. 200 Ok
  2. 204 no content (请求成功,但是没有结果返回)
  3. 206 partial content (客户端请求一部分资源,服务端成功反应,返回一范围资源)

4XX

1. 400 bad request (请求报文存在语法错误)
1. 401 unauthorized (需求认证 (第一次返回) 或者认证失败 (第二次返回))
1. 403 forbidden (请求被服务器拒绝了)
1. 404 not found (服务器上无法找到请求的资源)

5XX

1. 500 internal server error (服务端执行请求时发生了错误)
1. 503 service unavailable (服务器正在超负载或者停机维护,无法处理请求)

Mybatis

Mybatis执行流程 :

image-20231215193047642

延迟加载

xml中 局部

实现原理: cglib 动态代理

Mybatis缓存

一级缓存基于PerpetualCacheHashMap 作用域为SqlSession增删改以及close 操作后会清空 ,默认打开

二级缓存基于PerpetualCache的HashMap存储,作用域为 namespace和mapper,默认关闭

MySQL 面试题

谈谈对mysql的理解

d78f1cd5ed484202b9c6e8fa6f2d4a15.jpg

结构:

服务层 : 连接组件,提供连接池,对权限校验, 分析器: 先分析语法问题,再去查缓存 -> 再到优化器

引擎层

联合索引 a,b,c where b =1 and c = 2 and a = 3 , 单独 c = 2 不走索引

存储引擎层

日志层

索引 b+树 数据存储在叶子节点, b树 hash :不支持范围查询 (无序)

事务 acid 原子性,一致性,隔离性,持久性 实现: undo log redo log binlog

隔离性 : 读未提交,读已提交,可重复读(mysql默认),串行

并发事务问题: 脏读,不可重复读,幻读

解释下什么叫幻读: A事务第一次读有5条数据,B事务插入一条数据并提交事务.A事务 select count(*) 有6条 select * 只有5条

可重复读的情况下如何解决部分幻读 MVCC,间隙锁 加行锁

日志文件

集群

索引下推

MySQL 8.0 新特性 ?

in 与 exists 的区别

  1. in是把外表和内表做hash连接,先查询内表,返回一个数据列,这个数据列的值将提供给外层查询语句进行比较操作.
  2. Exists 是 对外表做loop循环,循环后再对内表查询,将主查询的数据放入子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据是否得以保留
  3. 在外表大 的情况下用in效率高,内表大的情况下用exists效率高

简记: in 小, exists 大

索引结构

  • B-Tree

image-20231217202119813

  • B+Tree

image-20231217202436439

image-20231217202645170

image-20231217202816008

image-20231217202910080

MySQL体系结构

image-20231217193926735

连接层,服务层,引擎层,存储层,日志层

存储引擎特点

  • InnoDB

image-20231217194632180

image-20231217194745578

  • MyISAM

image-20231217201528125

  • Memory

image-20231217201745199

image-20231217201836765

SQL优化

插入优化

顺序插入,批量插入,本地文件插入

1. limit优化

image-20231218135056370

2. count优化

image-20231226145126755

image-20231226150920421

3. update优化

索引不能失效,否则行锁变表锁

image-20231226151836273

image-20231226152334526

1. 全局锁

数据备份

image-20231226161215407

image-20231226155423354

2. 表级锁

image-20231226163122854

  • 表锁

image-20231226163724800

  • 元数据锁 (meta data lock ,MDL)

避免DML与DDL冲突,保证读写的正确性 . 增删改与 表结构改动的冲突

image-20231226164814676

  • 意向锁

当我们设置行锁的时候,会自动添加意向锁,用于与后来的表锁交互,判断能否兼容,能兼容则可以添加表锁

主要解决InnoDb中行锁与表锁的冲突问题

image-20231227002353937

3. 行级锁

image-20231227003542414

  • 行锁

image-20231227004124433

image-20231227012102944

image-20231227011712995

  • 间隙锁

image-20231227174542740

  • 临键锁

image-20231227174802652

InnoDB引擎

1.逻辑存储结构

image-20231227175912296

2.架构

image-20231227182500173

1. 内存框架

  • Buffer Pool

image-20231227182434966

  • Change Buffer

image-20231227190832268

  • Adaptive Hash Index (自适应哈希):

image-20231227190608551

  • Log Buffer

image-20231227190741923

2.磁盘结构

image-20231227220230798

image-20231227220322527

image-20231227220003953

3. 后台线程

image-20231227220823638

3.事务原理

image-20231227221104083

image-20231227221142116

  • redo log

image-20231227222741522

  • undo log

image-20231227223112643

4. MVCC

image-20231227224055189

  • 实现原理

image-20231227224959319

image-20231227225951237

readview

image-20231227230624865

image-20231227230555989

image-20231227232341445

image-20231227235357407

image-20231227235344488

image-20231228000320164

运维

日志

  • 错误日志
  • 二进制日志
  • 查询日志
  • 慢查询日志

Redis 面试题

Redis 数据一致性

(双写一致性)

image-20231217153448755

image-20231217153856230

image-20231217154115006

image-20231217154205649

image-20231217154244902

一致性要求高

允许延迟一致

image-20231217154244902

image-20231217154339439

image-20231217154626700

JVM 面试练习

  1. 一个类是怎么加载到JVM内存中的?

编译生成二进制字节码, 经过7步流程 加载->验证->准备->解析->初始化->使用->卸载

  1. jvm内存结构

堆,本地方法栈,程序计数器,虚拟机栈,元空间.

  1. 哪些是线程安全的哪些非安全? 注意 堆并不一定非线程安全

    非线程安全: 元空间,堆

    线程安全: 虚拟机栈,

    方法内部的局部变量不一定线程安全,要看作用域

4.程序计数器的作用

记录每个线程执行的位置

  1. 栈缓存了哪些信息

栈里面存放了1一个个栈帧,栈帧里面还有哪些 : 局部变量表,操作数栈,动态链接,方法返回值地址...

  1. java创建对象需要经过哪些操作

    给对象分配内存空间,初始化对象,将引用地址指向该对象

  2. 对象有哪些部分组成?

    对象头+实例数据+填充 如果是数组还有数组长度

  3. jdk 1.7 与 jdk1.8的区别

方法区变成元空间,改成本地内存, static 方法区移到堆区,常量池移到堆区

  1. 常量池的作用

    常量的复用

  2. 元数据存储了那些信息

    类的元数据 运行时常量池

  3. 怎么让元空间溢出?

    cglib提供了一个增强类,可以通过这个类大量创建类的元数据导致元空间溢出

  4. GC Roots的对象由哪些

    1. 虚拟机栈 (栈帧中的本地变量表)中的引用对象
    2. 方法区中静态属性引用的对象 堆区中的静态属性引用的对象
    3. 方法区中常量引用的对象
    4. 本地方法栈中JNI引用的对象
  5. 几种引用的区别:

    1. 强引用: == new 只有没有 GC Roots 指向的时候才会被垃圾回收处理
    2. 软引用: 当内存不足时,垃圾回收才会回收软引用对象
    3. 弱引用: 只要触发垃圾回收,就会回收弱引用对象
    4. 虚引用: 陪合引用队列使用,但被引用对象回收后 虚引用主要用来跟踪对象的回收,清理被销毁对象的相关资源。
  6. Jvm 调优

    经量保证启动时,堆占用50%以下

    关闭 from,to 区动态内存调整大小参数 -XX:-UseAdaptiveSizePolicy

    使用cms垃圾回收器时, 开启在老年代垃圾回收器之前让新生代回收一次参数

JVM

image-20231215211440301

image-20231215211542245

JVM组成

1. 什么是程序计数器

image-20231215213623751

2. Java堆

线程共享的区域,主要用来保存对象实例数组

S0: from S1: to

image-20231215214842215

1.7与1.8 的区别 方法区变成元空间,改存到 本地内存.static方法区移到堆区,字符串常量池移到堆区

image-20231215214622450

image-20231215215135569

3. 什么是虚拟机栈?

一个线程一个栈,一个方法一个栈帧

栈里存 参数,局部变量,返回地址

image-20231215220533981

image-20231215220601199

栈内存

image-20231215221019808

image-20231215221055213

栈帧默认为1m ,一般不会超过.

image-20231215221552216

4. 什么是方法区?

image-20231215234423879

image-20231215235406753

image-20231216000056891

image-20231215230023020

5. 什么是直接内存?

image-20231216001453980

image-20231216001512023

image-20231216001534712

image-20231216001403797

类加载器

1. 什么是类加载器

image-20231216100058054

image-20231216100134678

image-20231216100202131

什么事双亲委派模型?

image-20231216100218637

image-20231216100302787

image-20231216100327881

2. 类装载的执行过程

image-20231216102651695

1. 加载 : 导入class文件

image-20231216101213159

2.验证

image-20231216102902435

3.准备 : 为类变量分配内存并设置类变量初始值

image-20231216102920722

4.解析 : 把类中的符号引用转换为直接引用

image-20231216103103050

5.初始化 : 对类的

image-20231216103139705

6.使用

image-20231216103250418

image-20231216102008214

垃圾回收

1. 对象什么时候可以被垃圾器回收

主要是回收堆中的对象

image-20231216104345901

引用计数法 :循环引用,会引发内存泄漏

image-20231216110057277

image-20231216110143558

可达性分析算法

image-20231216110345554

哪些对象可以作为 GC Roots

image-20231216110450317

image-20231216105959349

2. JVM 垃圾回收算法有哪些?

  1. 标记清除算法
  2. 复制算法
  3. 标记整理算法

标记清除算法

image-20231216111417745

标记整理算法 : 一般老年代

image-20231216111512557

复制算法 : 一般年轻代

image-20231216111624529

image-20231216111832497

3. 说一下JVM中的分代回收

分代收集算法

对象头 : 4位二进制数 最大15

image-20231216115757342

image-20231216115910342

image-20231216114243291

Major GC 针对老年代

image-20231216120129821

4. 说一下JVM有哪些垃圾回收器

image-20231216120623360

串行垃圾收集器

image-20231216122437770

并行垃圾收集器

image-20231216121208624

image-20231216122310408

5. G1垃圾回收器

image-20231216152518973

需要触发stw

image-20231216152624501

image-20231216152725884

重新标记需要stw

image-20231216152817464

image-20231216153358529

image-20231216153411995

image-20231216153438400

image-20231216153523185

image-20231216152408493

6. 强引用,弱引用,软引用虚引用的区别

image-20231216154007241

image-20231216154240636

image-20231216154530627

image-20231216154621659

JVM实践

1. JVM调优的参数可以在哪里设置参数

  • war包部署在tomcat中设置
  • jar包部署在启动参数设置

image-20231216154846210

image-20231216154944897

image-20231216155005481

2. JVM调优参数都有哪些?

image-20231216155119842

image-20231216155253994

512k

image-20231216155937721

image-20231216160045411

image-20231216160122686

image-20231216160135710

7. 说一下JVM调优的工具?

image-20231216160659087

image-20231216162552351

image-20231216162742719

image-20231216162832611

image-20231216162908542

image-20231216163350286

7.Java内存泄漏的排查思路

image-20231216163600324

image-20231216165007956

image-20231216164647558

image-20231216164729290

2.CPU飙高排查方案与思路

image-20231216165414034

image-20231216165503617

image-20231216165550252

image-20231216165617884

线程创建

  1. 继承Thread类
  2. 实现runnable
  3. 实现Callable接口
  4. 线程池创建线程 项目中使用

image-20231214012730414

image-20231214103127394