面试题

面试题

Java

线程有几种创建方式?

  • 继承自Thread
  • 实现Runnable
  • 实现CallBack

线程的状态都有哪些?怎么转换?

  • 新建
  • 就绪
  • 执行
  • 阻塞
  • 结束

线程池的核心参数?

  • coreThreadPollSize
  • maxiumThreadPoolSize
  • wokerQueueSize
  • keepaliveTime

线程拒绝策略?

在这里插入图片描述

newFixed固定线程池的拒绝策略是哪个?

AbordPolicy 抛异常处理

讲一下JVM的内存模型?

String 与new String()上的一个异同?

String、StringBuilder、StringBuffered区别以及使用场景?

synchornized原理?

最底层源于操作系统上指令lock comexh

不存在竞争时,对资源进行加偏向锁(即对象头加偏向锁信息),多线程进行资源竞争时,线程通过CAS进行自旋处理,此时加的是一个自旋锁。自旋一定次数之后,线程还是得不到执行,此时,将升级为OS锁,由OS进行调度。

volitate原理?

  • 禁止指令重排序
  • 线程可见性,线程修改值之后立马同步到主内存之中,其他线程立即感知

ThreadLocal使用的原则?

线程变量。使用时需要注意可能会产生内存泄漏(虽然是弱引用)

类加载机制是怎么样的?主要有哪些步骤?

加载 -> 链接 ->初始化

  • 加载:将.class文件加载成为Class对象

  • 链接

    • 验证:校验文件是否符合规范,安全性验证
    • 准备:为静态变量开辟空间,分配内存
    • 解析:将常量池的符号转换成为引用
  • 初始化:初始化对象,赋值

Redis

缓存一致性。以及解决方案?

数据库数据与缓存数据的一致性。

解决方案:

  • 删除缓存,再更新数据库
  • 更新数据库,淘汰缓存
  • 更新数据库,删除缓存

redis数据类型有哪些?

基本数据类型

  • String
  • List
  • Set
  • Hash
  • Zset

特殊数据类型

  • HerperLogLog
  • Geo

redis持久化策略

  • RDB
  • AOF

redis过期策略?默认是什么?

  • 惰性过期 只有访问一个key时才会判断是否过期,过期则清除。对cpu友好,对内存不友好,占用内存。
  • 定时过期 每一个key设置一个定时器,时间到了,进行删除。
  • 定期过期 每隔一定的时间,判断key是否过期。过期进行清除。

redis中使用了惰性过期和定期过期两种策略。

redis集群主从复制原理?

  • 全量复制
    • 主节点公国bgsave命令fork子进程进行RDB持久化
    • 主节点通过网络将RDB文件发送给从节点
    • 从节点清空老数据,载入RDB文件,过程阻塞,无法响应客户端的命令;从节点执行bgWriteaof,也会带来额外的消耗。
  • 增量复制
    • 复制一个偏移量:执行复制的双方,主从节点,分别维护一个复制偏移量offset
    • 复制积压缓冲区:主节点内部维护了一个固定长度,先进先出的队列作为积压缓冲区,当主从节点offset的差距过大超过缓冲区长度是,将无法进行部分复制,只能进行全量复制
    • 服务器运行ID: 每个redis节点,都有运行的id,运行id由节点自动生成,主节点会将自己的运行id发送和给从节点,从节点会将主节点的id存起来,从节点redis断开重连时,就是根据运行id来判断同步的进度:
      • 如果从节点的runid与主节点的runid相同,说明之前同步过,主节点会继续尝试使用部分复制
      • 如果从节点保存的runid与主节点的runid不同,说明从节点在断线前同步的redis节点不是当前的主节点,只能进行全量复制。

redis是单线程还是多线程?为什么这么快?怎么处理多线程调用?

单线程。是基于Reactor模式开发的网络事件处理器,这个处理器乘坐文件事件处理器file event handler,属于单线程的。它采用了IO多路复用技术来监听多个Socket,根据Socket上事件类型来选择对应的事件处理器。文件事件处理器包含4个部分:多个Socket、IOI多路复用选择器、文件事件分派器、事件处理器。

多个Socket并发产生不同的操作,每个操作产生对应的butt同的事件,IO多路复用程序会建通多个Socket,

所有操作在内存中进行操作。单线程减少线程上下文的切换。

处理多线程调用使用了IO多路复用(引出epoll)的技术解决。redis串化处理

redis在项目中的运用?(什么场景下会使用redis结合实际)

redis怎么评估数据量?

聊一下Redis事务?

开启了redis事务之后,所有的命令不会马上执行,确定调用exec命令之后才会执行。事务开启期间只会校验命令的正确性。

常用命令

  • MULTI 开启事务
  • EXEC 执行事务
  • DISCARD 丢弃事务

Redis集群方案

哨兵模式

  • 集群监控 负责建通redis master与slave之间的进程是否正常
  • 消息通知 某个redis实例有故障,烧饼负责发送消息作为报警通知给管理员
  • 故障转移 如果master故障之后,会转移到slave节点上
  • 配置中心 故障转移发生之后

主从模式(Redis Cluster)服务端的Sharding技术,采用slot,一共分为16384个槽位。互为主从。

  • 通过hash的方式麻将数据进行分片,每个节点均分存储在hash槽位上,默认分配了16384的槽位
  • 每个数据分片会存储在多个互为主从的多个节点上
  • 数据写入先写入主节点,在同步到从节点
  • 同一个分片多个节点的数据不保持强一致性(支持配置为阻塞同步)
  • 读取数据时,当客户端操作的key没有分配在该节点上,redis会返回转向指令,执行正确地 节点
  • 扩容时需要将旧节点的数据迁移一部分到新节点

redis cluster架构下,每个redis需要放开两个端口号上,比如一个6379另一个是16384

16384端口就是拿来进行节点间通讯,集群之间通讯,进行故障检测,配置更新,故障转移

用了二进制协议gossip

优点:

无中心架构,支持动态扩容,对业务透明

具备sentinel的监控

客户端不需要链接集群的所有节点,链接人一个节点即可。

使用内存满了之后redis新增key的处理?

Mybatis

#{} 与 ${}的区别?项目中怎么使用?

#跟jdbc中的预编译一样,防止 sql注入,$是值替换

mapper.xml是如何load到mybatis中的

SqlSessionFatocy进行管理,获取到SqlSessionFactory之后,由SqlSessionFactory进行生产,每一条SQL语句使用SqlSession,

Mysql

讲一下数据库事务?

索引是什么?数据结构是怎么样的?唯一索引、联合索引是什么?

慢SQL怎么定位?

SQL优化?

数据库中年龄列存放是时间类型,怎么找出具体某一岁以下的男性?

datediff()

聚簇索引是个什么东西?

聚簇索引是指数据储存与索引都保存在叶子节点上,找到索引立马找到数据。

为什么用B+树?有什么好处?

多路查找树,树的高度低。减少查找的深度,加快查找速度。属于排序树,可快速查找数据。一个树除根节点之外都存在>=2的节点数。

什么情况下不会走索引?

  • like语句左右都有通配符
  • in、not in、not exits
  • or条件中存在没有建立索引的列
  • 函数运算

Mysql集群数据库的主从复制原理?

  • 全量复制 mysqldum进行全量的复制
  • 增量复制 数据库除DQL类型的语句都会记录binLog,通过网络,同步binlog

主节点起一个IO线程,将所有的DML,DDL的操作记录到binLog之中。从节点开启一个IO线程将binlog日志通过网络写入到本地relayLog,同时开启SQL线程将relayLog的数据读取到从节点的数据库之中。

数据库事务隔离级别?

首先明白什么脏读、幻读、可重复读的概念

  • 脏读 事务A对数据进行了更新,但是事务没有提交。事务B可以看到事务A的更新数据,若此时事务A操作失败进行回滚,事务B读到的数据就是属于脏数据
  • 不可重复读 两次查询读取的数据不一样。事务B两次读取事务的过程中,事务A进行了数据的修改
  • 幻读 与不可重复读类似,幻读是事务A处理过程中,事务B进行的处理影响了事务A的执行,实际事务A已进行成功,但是由于事务B的执行,导致事务A看着像没有成功一样

隔离级别:

  • 读已提交 read-commited
  • 读未提交 read-uncommittted
  • 可重复读 repeatable-read
  • 串行化 seriazabale
隔离级别脏读不可重复读幻读
读已提交存在存在存在
读未提交不存在存在存在
可重复读不存在不存在存在
串行化不存在不存在不存在

如何解决幻读?

通过间隙锁来实现.

间隙锁:对操作的数据除本条数据之外,临近的其他数据一并加锁进行处理。

如果我有一个Sql存在多个表之间联合查询以及大表,可以从哪些方面进行优化?

  • sql层面上查询字段上加索引
  • 数据库进行查询时,多表关联查询时是否存在强关联?不存在强关联可以尝试进行sql拆分
  • 大表数据是否可以进行分库分表

PG数据库与MYSQL的差别?

https://www.cnblogs.com/geekmao/p/8541817.html

MQ

如何保证消息的消费顺序?

  • rocketMq
    • 消息生产有序
    • 顺序消费的消息发送到同一个nameServer中的同一个队列之中
  • rabbitMQ
    • 顺序消息扔到一个queue,一个消费者进行消费
  • Kafka
    • 一个partition对应一个消费者
    • topic只有一个partition
    • 消息丢在同一个partition同一个topic中

如何解决重复消费?

MQ并不保证消息的重复。由应用程序进行确保。

  • 接口设计的幂等性

如何保证消息不丢失?

MQ消息丢失在任意一个阶段都有可能发生。

生产阶段往MQ发送阶段:生产者通过网络发送给MQ时,网络可能存在波动,从而导致消息丢失。该阶段可以通过发送给MQ之后收到MQ消息确认之后在进行确认,如果未收到确认可以尝试重试。

MQ集群同步阶段:MQ收到消息之后先存储 在内存之中,然后立刻响应生产者。MQ定时异步将消息刷入磁盘之中。异步刷盘减少了IO次数,可以用获得更好的性能,但若是发生服务器宕机,掉电,消息有可能丢失,所以可以改成同步刷盘的方式,消息刷入磁盘之后才回响应信息给生产者。

消费者:消费者收到MQ消息之后,确保业务的处理成功之后才给MQ回对应的响应信息。

rocketMq与RabbitttMq的选型?

  • 语言不同,rocketmq使用java进行开发,rabbitmq使用erlang语言进行开发(一种高性能的广泛应用于路由方面的语言),二次开发有需求的话需要考虑

Spring

事务隔离级别?

  • 读已提交 可以读取到其他事务已提交的数据,可能会出现幻读与不可重复读
  • 读未提交 可以读取到其他事务未提交的数据,会产生脏读,幻读,不可重复读
  • 可重复读(默认)可能出现幻读
  • 串行化 事务串行化执行

如何解决循环依赖?

三级缓存:singletonObjects、earlySingletonObjects、singletonFactories这三个Map:

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
 
   Object singletonObject = this.singletonObjects.get(beanName);
 
   if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
 
      synchronized (this.singletonObjects) {
 
         singletonObject = this.earlySingletonObjects.get(beanName);
 
         if (singletonObject == null && allowEarlyReference) {
 
            ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
 
            if (singletonFactory != null) {
 
               singletonObject = singletonFactory.getObject();
 
               this.earlySingletonObjects.put(beanName, singletonObject);
 
               this.singletonFactories.remove(beanName);
 
            }
 
         }
 
      }
 
   }
 
   return (singletonObject != NULL_OBJECT ? singletonObject : null);
}

讲一下SpringAop从代码角度?

SpringBean的生命周期?

Dubbo

服务A要引用服务B怎么进行配置?

  • 注册中心注册服务
  • xml配置dubbo:reference
  • 注解配置@Reference

讲一下dubbo协议,协议对比?

dubbo远程调用RPC原理?

SpringBoot

讲一下Springboot源码?

自动装配的原理?

自动装配原理通过BeanFactoryPostProcessor进行实现加载。

具体步骤:

  • 首先@SpringApplication标注的类,使用SpringApplication.run()进行推断是否存在main方法。
  • 再往下进入refresh方法,首先进行一些参数的设置,环境、监听器等。load()进行主启动类的加载到BeanFactory,
  • 然后进行refreshContext()实现Spring的redresh方法(1.准备基本属性,2获取beanFactory 3.进行beanfactorypostProccsor。)执行完之后进行invoke BeanFactoryPostProcessor,此时调用ConfigurationPostClass进行加载@Confiigurattion,解析所有@configuration修饰的类。
  • 解析所有@PropertiesSource注解
  • 解析所有@Import (在@EnableAuttoConfiguration里面)资源,解析@import指定的类
  • 进一步解析,此时将进行识别到@EnableAuttoConfiguration类,进行autoconfigure包中的spring.factories文件中配置的读取加载,此时通过autoconfig包内的spring-factory配置进行查找所有的自动装配的类

SpringClound

SpringClound都有哪些组件?

  • Ribbon
  • Hystrisx
  • Feign
  • Eruke

分布式

分布式事务解决方案有哪些?

  • XA 分段提交
  • TCC try-committ-canlcle
  • 本地消息表
  • 本地消息表消息化

分布式锁的实现方式?

  • redis
  • zookeeper

CAP理论与BASE理论

  • CAP理论
    • C Consisitenccy(一致性)
    • A Available(可用性)
    • P Partition tolerance (分区容错)

负载均衡

负载均衡的常见算法

  • 随机
  • 轮询
  • 源地址hash
  • 加权轮询
  • 加权随机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rio_NP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值