Java后端刷面经1

1 介绍项目?

我做的项目是线上商品交易平台,主要实现了用户登录,商品展示,商品详情展示,商品秒杀功能。服务端基于SpringBoot框架搭建项目后台。数据库使用MySQL,并且使用Redis来环节数据库的压力。

2 限流怎么实现的?

限流是通过Redis预先存储商品的库存数量,在Redis实现预减缓存,判断是否有库存;lua脚本实现减库存数据操作的原子性;也加了验证码辅助,让请求分散开。使用计数器算法限流,超过数量的请求拒绝。

3 超卖问题怎么解决?

Redis实现预减缓存,库存-1后大于0可以继续执行,小于等于0不再进行,返回库存不足,秒杀失败。

4 垃圾回收机制?

先通过可达性算法判断是不是垃圾对象,如果是垃圾对象,就想

5 HashMap和LinkedHashMap?

HashMap
  • HashMap 是一个散列表,它存储的内容是键值对(key-value)映射
  • HashMap继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
  • HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null,其中HashMap最多只允许一条记录的键为Null允许多条记录的值为Null。此外,HashMap中的映射不是有序的
  • HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。
    容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。
    加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。
    当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
    通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折中。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。
LinkedHashMap
  • LinkedHashMap是HashMap的子类,但是内部还有一个双向链表维护键值对的顺序,每个键值对既位于哈希表中,也位于双向链表中。
  • LinkedHashMap支持两种顺序:插入顺序 、 访问顺序。
    1.插入顺序:先添加的在前面,后添加的在后面。修改操作不影响顺序**(双向链表维护)**
    2.访问顺序:所谓访问指的是get/put操作,对一个键执行get/put操作后,其对应的键值对会移动到链表末尾,所以最末尾的是最近访问的,最开始的是最久没有被访问的,这就是访问顺序。
区别
  • 保存插入顺序:
    HashMap遍历时,取得数据的顺序是完全随机的。
    LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。也可以在构造时带参数,按照应用次数排序。
  • 速度:
    LinkedHashMap在遍历的时候会比HashMap慢,不过有种情况例外:当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢。因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

6 栈和队列?

是两种数据结构。
是先进后出,后进先出。
队列是先进先出,后进后出。

7 三次握手和四次挥手?

三次握手是客户端与服务端连接过程:第一次是客户端先向服务点发送请求,第二次服务端回应客户端,第三次是客户端发给服务端表示要发送数据了。
四次挥手是客户端与服务端断开通信的过程:第一次客户端向服务端发送表示先搞断开连接,第二次服务端向客户表示接收到请求开始准备断开,第三次还是服务端向客户端表示准备好了可以断开连接,第四次客户端告诉服务端已经断开连接了。

8 JVM垃圾回收算法?

  • 复制算法
  • 标记清除算法
  • 标记压缩算法

9 G1垃圾回收器?

  • JDK9 默认 (废弃了之前的 CMS 垃圾回收器)。
  • 整个 G1 的垃圾回收阶段分成了这么三个:
  • 第一个阶段叫 Young Collection,就是对新生代的垃圾收集。
  • 第二个阶段叫 Young Collection + Concurrent Mark,就是新生代的垃圾收集同时呢会执行一些并发的标记。
  • 第三个阶段叫 Mixed Collection 混合收集。
  • 刚开始是这个新生代的垃圾收集,经过一段时间,当老年代的内存超过一个阈值了,那么它会在新生代垃圾收集的同时进行并发的标记,等这个阶段完成了以后,它会进行一个混合收集,混合收集它就是会对新生代、幸存区还有老年代都来进行一个规模较大的一次收集,等内存释放掉了,混合收集结束。这时候伊甸园的内存都被释放掉,它会再次进入新生代的一个垃圾收集过程,这是一个循环的过程。

10 JVM内存分区(5块)?

1)线程私有:

  • 虚拟机栈: 八大基本数据类型,对象的引用,实例的方法
  • 本地方法栈:登记native方法
  • PC寄存器

2)线程共有:

  • :数组,对象实例
  • 方法区:所有字段,方法字节码,静态变量,常量,类信息,即时编译器编译后放入的代码

11 事务的特性(4个)?

  • 原子性
    一个事务要么全部提交成功,要么全部失败回滚。
  • 一致性
    事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
  • 隔离性
    事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。

在标准SQL规范中,定义了4个事务隔离级别,分别是:未授权读取,授权读取,可重复读取和串行化。

1、读未提交(Read Uncommited)
该隔离级别允许脏读取,其隔离级别最低;比如事务A和事务B同时进行,事务A在整个执行阶段,会将某数据的值从1开始一直加到10,然后进行事务提交,此时,事务B能够看到这个数据项在事务A操作过程中的所有中间值(如1变成2,2变成3等),而对这一系列的中间值的读取就是未授权读取

2、授权读取也称为已提交读(Read Commited)
授权读取只允许获取已经提交的数据。比如事务A和事务B同时进行,事务A进行+1操作,此时,事务B无法看到这个数据项在事务A操作过程中的所有中间值,只能看到最终的10。另外,如果说有一个事务C,和事务A进行非常类似的操作,只是事务C是将数据项从10加到20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取。

3、可重复读(Repeatable Read)

就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的,因此该事务级别禁止不可重复读取和脏读取,但是有可能出现幻影数据。所谓幻影数据,就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。在上面的例子中,可重复读取隔离级别能够保证事务B在第一次事务操作过程中,始终对数据项读取到1,但是在下一次事务操作中,即使事务B(注意,事务名字虽然相同,但是指的是另一个事务操作)采用同样的查询方式,就可能读取到10或20;

4、串行化

是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行


  • 持久性
    一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。

12 什么时候用异步线程?

所有的“等待的情况”都需要异步。

13 什么时候用消息中间件?

使用一个独立的系统分离 订单结果 和 更改数据库库存处理 。

14 RabbitMQ除了异步有什么特点?

1.rabbitMQ官网上说的特点是6个 (https://www.rabbitmq.com/)

  • 异步消息
  • 支持多种开发语言
  • 支持分布式
  • 企业和云就绪
  • 工具和插件
  • 管理和监控

15 Redis缓存穿透,缓存击穿,缓存雪崩?

  • 缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
  • 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
  • 缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

17 UUID?

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。最广泛应用的UUID,是微软公司的全局唯一标识符(GUID)。

18 并行和并发?

并行:针对多核CPU,同一时刻,多个任务。
并发:针对单核CPU,同一时刻,多任务交替进行。

19 进程和线程?

进程资源分配的基本单位,它是程序执行时的一个实例,在程序运行时创建;
线程程序执行的最小单位,是进程的一个执行流,一个线程由多个线程组成的。

  • 关系:
    一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行;
    相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

20 分布式锁?

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值