前言

面试官很有亲和力,很和善.并且也会有一丢丢小提示引导我问题回答.总的来看问题都不难哦.可以一试

1. 项目介绍

个人项目参与度比较高,面试官觉得可能还是实现为主吧,问的问题都比较基础

2. JDK1.8版本的新增特性

lambda表达式、Stream-API、Optional 类、日期API
查看: Java 8 新特性

3. JVM模型

  1. 线程共享-元数据区: 存放加载的类信息;常量、静态变量;jit编译后的代码信息
  2. 线程共享-堆: 存放程序执行过程中创建的对象;以及字符串常量池;
  3. 线程隔离-程序计数器: 当前线程执行的字节码行号指示器,记录执行的位置;Native方法则为空
  4. 线程隔离-Java虚拟机栈: 描述方法执行的内存模型,线程执行方法时将会入栈一个 带有方法所需的局部变量表、操作数栈、方法信息动态链接、方法出入口信息的栈帧,方法执行完毕弹出栈帧
  5. 线程隔离-本地方法栈: 同上,只不过是执行Native方法使用

4. 堆模型以及结合其他方面讲解为什么这样设计(垃圾回收)

5. 什么时候会发生FULLGC

6. 设计模式(问了模板模式)

设计模式败北

7. JUC包了解吗

8. spring-boot-starter使用过吗

Spring-boot-starter核心功能自动装配(Spring自己实现的SPI功能).自己使用starter实现自定义数据源配置的starter.用来弥补公司内部框架每创建一个微服务都要赋值一份自定义数据源配置的代码类
实现方式:

  1. 创建一个以spring-boot-starter-parent为parent的Maven项目
  2. 添加自己实现所需的依赖: spring-boot-autoconfigure、spring-boot-configuration-processor之类
  3. 创建对应配置类(比如数据源/连接池/自动配置加载设置的配置文件等)
  4. resource/META-INF/spring.factories文件创建
  5. 文件配置org.springframework.boot.autoconfigure.EnableAutoConfiguration的值为我们创建配置类的全路径名即可(逗号隔开).

SPI机制可查看@SpringBootApplication->@EnableAutoConfiguration->AutoConfigurationImportSelector.class->118行getCandidateConfigurations->SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,getBeanClassLoader());
可以看这篇Springboot自动装配及实现

9. seata在项目上的使用场景

  1. 主要防止部分服务执行失败导致的数据一致性破坏的问题
  2. 减少业务上的错误判断,保证代码整洁与可读性(不加分布式事务组件就只能在调用链上一步一步自行判断对错与否,再自行数据回溯)

10. Oauth2的授权流程

  1. 授权需要授权服务器(处理授权请求)+资源服务器(存放用户信息资源)
  2. 授权服务器接收到用户授权请求后,会拿着授权信息(可是用户名密码、第三方token等)与从资源服务器(可是本地用户服务、第三方token验证接口等)获取对应信息,比对该授权信息和从资源服务器中获取到的资源是否一致
  3. 当一致则发放授权(生成token/session)否则返回授权失败
    理解OAuth 2.0

11. 消息有序性

  1. 单队列/单分区.单一消费者同步消费保证全局有序性
  2. 多队列/多分区对应多消费者一对一消费,将消息按照Key路由到指定队列上保证部分有序性(同一用户的信息只会路由到一个固定队列上)

12. 消息积压解决

在排除生产者端的业务问题后,那就是消费者端的消费能力不足;

  1. 增加消费者数量
  2. 机器负载能力足够的话,可以考虑将消息通过线程池异步处理,提高消费能力

13. 想要换工作的目的

  1. 寻找一个业务平台更复杂更能锻炼解决思路的工作
  2. 趁着面试算是对自己的考试吧,错题总是让人印象深刻

14. 反问