经过这10家面试,总结出以下经验(问题):

1.springcloud+MQ是当前开发框架的标配。
简历上不写这样的项目,没有面试的机会。
写了,就得流利的表述。

2.数据库是重中之重。数据库的优化、分库分表、分布式数据库的事务问题。

3.多线程是必问的。不止于简单的“多线程的几种创建方式”,一定要有系统的知识体系。

4.tomcat、jvm的优化,经常会问到。不是刷面试题能解决的,知识要系统。

5.spring、springboot、springmvc的使用和原理,经常问到。

6.常用的设计模式和应用场景。

7.经典的算法要能手写几个(有一个offer是因为手写了递归)
8.以上都可以作为课题去研究,不要止于面试题。

面试心得:
1.记忆大于逻辑,表达重于实操;
2.多看书,重理论,扩展深挖知识面;
3.每天整理面试题,每周复习巩固;
4.建一个主流技术的工程,使用最新的技术完善之;
5.开发、代码审核(sonar)、部署(docker、jenkins、k8s)、常用的测试工具 要熟练;
5.多下载GitHub上的项目,依照spring/springcloud(中文)网站学习,多逛论坛;Eur

注册中心:
zookeeper
Eureka
Consul
nacos

什么是Spring ?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 它解决了业务逻辑层和其他各层的松耦合问题

Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

SpringBoot

MVC 工作原理
用户发送请求 前端控制器 dispatcherServle 接收用户请求和响应 解析到对应的handler (也就是controller) 通过hadler(请求查找) 处理器映射器 HandlerMapping
返回一个执行链 请求适配器执行 业务类 模型层数据 返回modelAndView数据 请求视图解析器解析 返回view 视图渲染,将模型数据填充到request域中

Spring的bean注解
@Component @repositor @Service @Controller

Spring事务的管理方式
编程式事务
声明式事务

为啥要用SpringBoot(架构选型)
方便集成,快速开发
SpringBoot注解启动的两种方式
第一种: @SpringBootApplication
第二种: @configuration @EnableAutoConfiguration @ComponentScan
web项目注入其他语言的组件
JNI调用

Spring的版本号
Spring1.x: Bean的xml配置文件只支持DTD,在配置文件里定义任何东西都需要通过元素
Spring2.0:Spring2.0支持基于xml schema的配置,允许使用spring的新标签,spring2.0支持注解驱动的配置,这些注解在特定的模块里有效,例如:@Required,事务@Transaction,等
Spring2.5:支持更多的注解,包括@Autowired和JSR-250注解的@Resource,@Controller @RequestMapping @RequestParam @modelattribute
Spring3.x 支持基于Java类配置
Spring4.x 1、 全面支持java8.0,支持Lambda表达式的使用 2、 Map依赖注入的支持,List依赖注入,CGlib动态代理的增强 3、web增强SpringMVC基于基于Servlet 3.0 开发,并且为了方便Restful开发,引入了新的RestController注解器注解,同时还增加了一个AsyncRestTemplate支持Rest客户端的异步无阻塞请求。4.websocket的支持。
Spring5.x: java8以上,核心容器更新,测试方面提升

Spring中自定义组件

消息中间件有哪些

事务的特性: 原子性(以事务为单位 一个事务是一个原子操作单元) 一致性 (数据保持一致性)
隔离性 (多个事务之间的操作互不影响) 持久性 (数据保存成功不可修改)

事务并发带来的问题:
更新丢失 两个事务(T1,T2)对同一个数据读取并修改 ,第二个事务覆盖第一个事务 的提交结果,导致第一个事务的修改被丢失
脏读 (读取的值和数据库中存在值是不同的 针对于未提交数据) 张三的工资5000 事务A将工资改为8000 事务B正在读取数据,读取值为8000
此时事务A因为异常回滚,导致数据修改为5000 事务B读取的是8000 读取值和数据库中值不同
非重复读 (针对于数据本身 已提交事务) 同一个事务A内前后读取的结果不一致
事务A 一次查工资 5000 执行一些别的业务 同时有一个事务B修改数据为 8000 事务A 还要在查一次工资 8000 (不可重复读对应的是update)
幻读 针对其他提交前后,读取数据条数的对比 事务A查询工资为5000的人有10个 此时事务B插入一条数据 事务A再次读取工资为5000的员工为11 (同一个事务一次和两次数据不同) (幻读对应的是insert)

Spring 事务的隔离级别有几种
读未提交 Read Uncommitted 一个事务可以读取另一个未提交事务的数据 (会产生脏读) 【非重复读和幻读的事务B都是已提交事务导致的】
读已提交 READ COMMITTED 一个事务需要等另一个事务提交以后才可以读取数据 (可以解决脏读问题 会产生非重复读和幻读)
可重复读 REPEATABLE READ 再读取数据的时候 不允许有修改操作 (可以解决非重复读、脏读的问题)
(串行化)Serializable 事务串行化顺序执行 可以解决 脏读 非重复读 幻读 但是这种事务效率低下,损耗数据库性能 一般不可使用 (最高的隔离级别 也是最慢(指效率)的事务级别)
mysql默认的隔离级别是 可重复读 orcal 和sqlserver的默认隔离级别是读已提交
读已提交产生的不可重复读 幻读 读未提交产生的脏读
共享锁和排他锁
共享锁又称为读锁 读取操作时创建的锁 其他用户可以并发读取数据
若事务T对数据A加上共享锁,则事务T只能读A; 其他事务也只能对数据A加共享锁,而不能加排它锁,直到事务T释放A上的S锁。

若事务T对数据对象A加上排它锁,则只允许T读取和修改数据A,其他任何事务都不能再对A加任何类型的锁,直到事务T释放X锁。

什么是事务:
是数据库操作的最小单元,是作为单个逻辑工作的执行的一系列操作,要成功都成功,要失败都失败

分布式事务:
就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,
分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

CAP定理: 一致性 C 可用性 A 分区容错性 P

事务的传播性7种:
保证同一个事务中

(required) PROPAGATION_REQUIRED 代表如果已经存在一个事务,就加入到这个事务中。如果当前没有事务,就新建一个事务,就是默认的事务传播设置。(默认)

(supports) PROPAGATION_SUPPORTS 代表如果已经存在一个事务,就加入到这个事务中。如果当前没有事务,就以非事务方式执行。
(mandatory) PROPAGATION_MANDATORY 代表如果已经存在一个事务,就加入到这个事务中。如果当前没有事务,就以抛出异常
* 保证没有在同一个事务中

PROPAGATION_REQUIRES_NEW 代表新建事务,如果已经存在一个事务,就把这个事务挂起
PROPAGATION_NOT_SUPPORTED 代表如果已经存在一个事务,就把这个事务挂起,并以非事务方式执行。
PROPAGATION_NEVER 代表如果已经存在一个事务,就抛出异常。如果当前没有事务,以非事务方式执行。
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

分布式事务的问题:
两阶段提交方案:XA方案 (需要数据库版本支持 性能不理想) 两阶段提交
TCC方案 (Try-Confirm-Cancel)
try 尝试执行业务 (完成所有业务检查 一致性 预留必须业务资源 准隔离性)
Confirm 确认执行 真正执行业务 不做任何业务检查 只使用try阶段预留资源业务 Confirm 操作满足幂等性
Cancel 取消执行业务 释放Try阶段预留的业务资源 Cancel操作满足幂等性
自我理解: try阶段 数据的校验 检查 预提交 confirm 如果都成功进行confirm Cancel 如果有一方的confirm有问题则转向cancel 相当于confirm的逆操作
原理: TCC框架都是通过注解的形式实现 通过AOP对带点注解的方法进行拦截 之后再根据结果分别执行Confirm或Cancel
本地消息表
可靠消息最终一致性方案 MQ
1、A系统向消息中间件发送一条预备消息
2、消息中间件保存预备消息并返回成功
3、A执行本地事务
4、A发送提交消息给消息中间件
步骤一出错 事务失败 不执行A
步骤二出错 事务失败 不执行A
步骤三出错 需要回滚预备消息 由消息中间件的回调接口,消息中间件会去不断的执行回调接口,检查事务是否执行成功
步骤四出错 A的本地事务是成功呢, 这时候消息中间件可以检查出A执行成功,不需要A发提交消息,消息中间件可以对自己消息进行提交,完成事务

最大努力通知方案

微服务 (架构)

服务注册: 基础架构于原理解析

Ribbon负载均衡: 原理解析 源码分析 使用

Fegin

服务器容错保护

分布式配置中心

服务网关 Gateway ZUUL

消息总线(BUS)

分布式服务跟踪(Sleuth)

消息驱动框架

算法:
轮询算法
常用: 二分 (折半查找)
选择
冒泡
插入
快速
高级算法: 分儿治之
贪婪
动态规划
回溯
分支界限
一致性算法:paxos
zab
raft
gossip

设计模式
工厂
代理
模板模式
单例
策略
原型

多线程(线程池创建)
创建线程有4种: Thread、 Runnable Callable Executor 的工具类创建线程池
newCachedThreadPool: 创建一个可缓存线程池
newFixedThreadPool: 创建一个定长线程池 可控制线程最大并发数
newScheduledThreadPool: 创建一个定长线程池 ,支持定时及周期性任务
newSingleThreadExecutor 创建一个单线程划的线程池,他只会用唯一的工作线程来执行任务

线程的生命周期及5种状态:
1、新建状态 线程创建以后会进入新建状态
2、就绪状态 当调用start()方法 线程就开始进入就绪状态 处于就绪状态只是说明此线程已经做好准备,随时等待CPU调度执行
3、运行状态 (run方法)CPU开始调度处于就绪状态的线程 线程才真正执行
4、阻塞状态 处于运行中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时就进入阻塞状态
产生阻塞的原因: a.运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
b.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
c.通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态 线程执行完毕或退出run() 该线程结束生命周期
线程池的优点:
1、重新使用存在的线程,减少对象的创建销毁开销
2、可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
3、提供定时执行、定期执行、单线程、并发数控制等功能
11、常用的并发工具类有哪些?
CountDownLatch (使用过)
CyclicBarrier
Semaphore
Exchanger

sleep方法和wait方法有什么区别?
sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器
ConcurrentHashMap的并发度是什么
ConcurrentHashMap的并发度就是segment的大小,默认为16,这意味着最多同时可以有16条线程操作ConcurrentHashMap,这也是ConcurrentHashMap对Hashtable的最大优势,
任何情况下,Hashtable能同时有两条线程获取Hashtable中的数据吗?

redis
redis为啥那么快:

缓存降级: 服务出现问题(响应慢或不响应)或非核心服务影响到核心服务,仍然需要保证核心服务可用,系统会根据一些关键数据自动降级,也可以配置自动降级
以参考日志级别设置预案:

(1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

(2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
(3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
(4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。
服务降级的目的:是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,
Redis出现问题,不去数据库查询,而是直接返回默认值给用户。

缓存雪崩 : 原缓存失效,新缓存未到期(缓存采用了相同的过期时间,在同一时刻出现大面积缓存过期,所有原本应该访问的缓存请求全都查询数据库了,对数据库CPU和内存造成巨大压力,严重
会造成数据库宕机,从而形成一系列连锁反应,造成系统崩溃)
解决方案:加锁,或者队列的方式保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上 或者将缓存失效时间分散开来

缓存穿透 : 用户查询数据,在数据库没有,自然缓存中也不会有,这样就导致用户查询的时候缓存中没有,每次都要查询数据库,返回空,相当于两次无效查询
解决方案: 布隆过滤器 将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力

缓存更新 :常见的策略(1、定期清理缓存 (缺点:需要维护大量的key,比较麻烦)
2、当用户的请求过来时判断这个请求所用到的缓存是否过期,过期就去更新 (缺点:每次用户请求都需要判断缓存是否失效,逻辑相对复杂))

redis做点赞功能
选择redis的原因是支持更多的数据类型 (hash,set,zset)
批量存入到redis (选择hash 存储的是一个点赞对象,这样可以对应数据库的一行记录,很方便) 峰值较小的时候用定时将缓存中的数据写入数据库 缓存清空
优点:性能高,缓解数据库读写压力
缺点:开发复杂,不能保证数据的安全性
MQ

ES

mongodb

sql优化

jvm 调优和tomcat的优化

深拷贝和浅拷贝

微服务 (架构)

服务注册: 基础架构于原理解析

Ribbon负载均衡: 原理解析 源码分析 使用

Fegin

服务器容错保护

分布式配置中心

服务网关 Gateway ZUUL

消息总线(BUS)

分布式服务跟踪(Sleuth)

消息驱动框架

框架、事务、多线程、高并发、 微服务(用过哪些,作用,实现原理,怎么选择)、mybatis。还有数据库、ES、
gateway做的路由 eureka做的服务注册/发现 nacos做的统一配置管理
现在就是nacos注册、nacos服务配置、消息总线
consul 就是一个 公司开发的,dubbo也能用
Eureka 拜拜了~
Fegin也停更了
Hystrix也跪了
gateway做的鉴权
还有服务限流 服务熔断 服务降级,什么断路器是怎么工作的,熔断后恢复机制是什么。
还有 Eureka Zookeeper Consul,都有安全模式吗? 安全模式的作用是什么? 他们三个的设计模式是什么,那个是AP哪个是CP
还有问 微服务为了避免配置冗余,要使用配置中心集中化管理。要怎么实现。配置文件要怎么管理。

三范式

工厂模式

联合索引

redis :
类型:
String
Hash
List :
存数据: LPush key value
去数据: LRange key 0 10

Set
sorted set

rabbitMq如何实现分布式事务的

mybatisPlus 原理

oauth2 原理:
用户访问第三方网站,相对用户存放在服务商的某些资源进行操作
第三方网站会向服务商请求一个临时令牌
服务商验证第三方网站的身份后生成一个临时令牌
第三方网站获得临时令牌将用户导向至服务商的授权页请求授权,这个过程将临时令牌和第三方网站的返回网址发送给服务商,
服务商再授权页输入账号和密码,授权第三方网站访问相应的资源,授权成功,返回到第三方网站的地址
第三方网站根据临时令牌从服务商那里获取临时令牌
服务商根据令牌和用户的授权情况授予第三方网站的访问令牌
第三方网站使用获取到的访问令牌访问存在服务商的对应的用户资源上

冒泡排序

极光推送和微信飞鸽接口Api调用的设计

数据库索引

jdbc、mybatis、hibernate的事务启动

Spring bean 是线程安全的吗?

web.xml如何保证serverlet的执行顺序

逛的技术网站

看过的书籍

sevletContext

IOC的设计思想

SPringMVC原理

事务隔离级别

Springboot 如何加载pom文件里的依赖的

redis 做分布式锁

redis持久化方式

mysql的查询条件放到后边还是前边效率高

lambda表达式的Stream·

消息队列数据丢失
生产者
开启事务 消耗性能
confirm 每一次写都会分配一个di 成功会回传一个ack 不成功是nack
消费者
消费者用rabbit的ack机制 关闭掉自动ack, 通过api调用处理,确保处理完在ack
rabbitMq
创建queue的时候持久化
发送消息的时候将deliveryMode 设置为2

消息队列的优缺点
场景: 解耦 异步 削峰
rabbitMq微妙级的

java类加载器
bootstrap ClassLoader
extension ClassLoader
Application ClassLoader
自定义 加载器
双亲委派: 类加载的时候先委托给父亲

线程池
核心参数
核心线程数量:(cpu使用率高的话是cpu的线程数 如果IO操作高 可以是CPU的2倍)
最大线程数量
线程空闲后的存活时间
时间单位
用户存放任务的阻塞队列
线程工厂类
当队列和最大线程池都慢了之后的饱和策略

流程:
ture
提交任务 —>超过核心线程——>添加到队列—》线程已超最大线程数 —执行饱和策略(4种)如果核心线程数 队列 最大线程都满 执行策略
false | |

创建线程并执行任务 等待处理

java GC:
gc是一种分代收集算法,用于释放jvm种那些不再使用的对象
GC发生在堆中

聚簇和非聚簇索引的区别:

数据库读写分离如何做到数据同步

雪崩如何解决
将缓存时间分散开来 或者加入队列 防止集中对数据库并发

mybatis的一级二级缓存

读写分离如何做到数据同步

中高级Java面试心得相关推荐

  1. 46道面试题带你了解中高级Java面试,Java开发必看书籍

    前言 分布式事务主要解决分布式一致性的问题.说到底就是数据的分布式操作导致仅依靠本地事务无法保证原子性.与单机版的事务不同的是,单机是把多个命令打包成一个统一处理,分布式事务是将多个机器上执行的命令打 ...

  2. java面试心得_Java面试题分享(一)Spring总结

    最近有时间,整理了一下面试的心得和一些问题,给面试java岗位的小伙伴做个参考.重点部分我会用别的颜色标注一下 1.1.说一下你对 Spring 的理解? 关于 Spring 的话,我们平时做项目一直 ...

  3. java 面试心得总结-BAT、网易

    声明: 文章转自http://www.nowcoder.com/discuss/3043?type=2&order=0&pos=5&page=2 之前实习的时候就想着写一篇面经 ...

  4. 一线互联网大厂中高级Java面试真题收录!面试必会

    前言 可以说掌握这个pdf上的知识,面试问的基础知识无处左右,我凭借这个pdf拿下了OPPO/百度,京东,华为,美团,蚂蚁金服等互联网公司的offer. 下文中截图来源于朋友一个pdf版本的面经,把所 ...

  5. 2021年Java面试心得:java短信模板设计

    应聘求职 每年这个时候,都是应届生求职以及在职人员跳槽的高峰期.对于即将成为程序员的应届毕业生们.在求职过程中怎样确定目标公司和目标职位,大家在求职过程中要注意哪些细节?这些都是大家所关心的话题. ① ...

  6. 中高级Java面试中你不得不会的知识点,完整版开放免费下载!

    正文 如果你参加过一些大厂面试,肯定会遇到一些开放性的问题: 1. 写一段程序,让其运行时的表现为触发了5次Young GC.3次Full GC.然后3次Young GC: 2. 如果一个Java进程 ...

  7. 2021年Java面试心得:京东面试真题解析

    对于面试大厂的朋友,一些建议 阿里 阿里面试官一般都是P7/P8岗,对标到普通互联网公司相当于就是技术专家那种类型!他们对于没有经验的毕业生面试问的比较浅一点,大多数问题问的集合.锁.JVM调优,线程 ...

  8. Java面试心得必备技能储备详解,图文详解!

    前言 现在刷抖音经常可以看到一些老外街坊,问他们最想把什么带回自己的国家,我听过很多的回答都是:淘宝,支付宝,美食,微信,外卖,高铁等等. 确实如此,随着国家的快速发展吸引了不少国际上羡慕的目光,更让 ...

  9. 京东JAVA面试心得与面试题详解

    2018年的冬季特别的冷,无疑是程序员的寒冬,我也是年底裁员大潮裁下来的一名,(整个业务线都裁了  难受中~)但临近年底了失业回家也不太好所以有投了几份简历,现在已经找到工作了,虽然不是京东但也马马虎 ...

最新文章

  1. 为什么大部分人做不了架构师?
  2. 11CSS框架协助前端布局
  3. wine清除软件残余图标
  4. 推荐两个漂亮的编程字体
  5. 【Kafka】kafka报错 UnknownHostException: %HOSTGROUP::host_group_zookeeper%: Temporary failure in name re
  6. 读书笔记_中国期货市场量化交易(李尉)03
  7. Python 定时器制作
  8. WMS仓储管理系统解决方案
  9. 明解c语言入门篇有用吗,各位初学者在用明解C语言(入门篇)的时候花费了多长时间?...
  10. 学生:无效文件.dsn问题
  11. Starling学习笔记
  12. bucket name does not follow Amazon S3 standards
  13. IDM短信发送接口设计说明
  14. 苹果xr配置_看看下面这些对比,你就知道苹果x和xr哪个好?
  15. 点云地面滤波--渐进式形态学滤波
  16. 深度融合信息化 视频监控打击震慑犯罪
  17. C#_图片存取数据库Winform
  18. 2014年7月16日
  19. Linux宝塔详细使用教程
  20. 超透镜案例仿真(5)——宽带消色差 超构透镜模型 补偿相位与几何相位结合 FDTD仿真 超表面

热门文章

  1. 我不知道如何使用这台计算机用英语怎么说,我不知道英文
  2. SIM卡的结构和类型
  3. 为你推荐一款最好用的免费截图工具-Snipaste,截图高清、智能模糊还支持滚动长截图!!!
  4. transformer面试题的简单回答
  5. 第二十七篇 网页数据解析三种方法: 正则表达--BeautifulSoup--xpath 满满的干货
  6. 2023跨年烟花代码HTML5夜景放烟花绽放动画效果
  7. 计算系数(二项式定理逆元费马小定理)
  8. 二代测序下机数据的数据处理
  9. Vue 使用iconfont
  10. connection closed gracefully问题