整理牛客网 ----- 阿里校招 Java 后端 1-5 面 + HR 面面经

73 篇文章 8 订阅
12 篇文章 0 订阅

一、一面 8.27(约 60 min,电话)

1.做过的印象最深的项目?(聊项目)

2.MySQL 的 log 有哪些?分别是用来做什么的?(undo log,redo log,binlog)

重做日志(redo log):确保事务的持久性。redo日志记录事务执行后的状态,用来恢复未写入data file的已成功事务更新的数据。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
回滚日志(undo log):保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
二进制日志(binlog):用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步.

3.数据库分表分库?(没实践过,扯了点水平分表和垂直分表的理论)分库分表的全局唯一 ID怎么实现?

垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库
垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。 MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能
雪花算法 生成64位的Long型数字
第一位未使用
接下来41位是毫秒级时间,41位的长度可以表示69年的时间
5位datacenterId,5位workerId。10位的长度最多支持部署1024个节点
最后12位是毫秒内的计数,12位的计数顺序号支持每个节点每毫秒产生4096个ID序列

4.数据库 ACID? 简单

5.数据库事务的隔离级别? 简单

6.慢查询的优化思路?简单

7.你做过那个项目之后,在数据库这块有怎样的提升?(扯了点外键约束相关)

8.Java HashMap 的 put 操作底层是怎么实现的? 简单

9.线程池的构造器的参数介绍一下? 简单

10.Lock 和 synchronized 的区别? 简单

11.AtomicLong 类的底层实现原理

AtomicLong是作用是对长整形进行原子操作。
在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。

12.线程的状态? 简单

13.实际使用过多线程吗?(没有……)

14.什么情况下会发生死锁? 简单

15.JVM 内存的划分? 简单

16.Java 堆的划分? 简单

17.为什么要分代? 简单

18.垃圾收集器了解哪些? 简单

19.哪些对象会被 JVM 垃圾回收? 简单

20.GC ROOTS 包括哪些?

我的理解是:无论是引用计数器算法还是可达性算法,都重点关注的是“引用”,引用通俗的说是指向另一块内存的地址。所说的四种GCroot对象的引用,分别存在于虚拟机栈、本地方法栈和方法区中。楼主所说的对象的属性本深就在对象的“实例数据”中,让它作为GCroot,无法解决互相依赖的问题

21.OOM 排查?(不知道……)

22.Java 怎么利用反射获取一个类的字段?

getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
String fieldName = field.getName(); 获取字段的名称
Field[] fields = User.class.getDeclaredFields(); 获取所有

23.常见的类加载器? 简单

24.看过哪些框架的源码?

25.Spring @Autowired / @Resource 的区别?

@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按byType自动注入,而@Resource默认按byName自动注入。

26.Spring 依赖注入的原理

Spring的依赖注入依靠了动态代理和反射,发现Spring获取Bean 最后几乎都是从map中拿值,就想到了 Spring可能是在启动时就将实例对象缓存,之后都是不断的复用。

27.Spring bean 的作用域有哪些

singleton和prototype,前者表示Bean以单例的方式存在;后者表示每次从容器中调用Bean时,都会返回一个新的实例,prototype通常翻译为原型

28.session 和 cookie 的区别? 简单

29.如何识别 session? 简单

(存在 cookie 里面的 session id)

30.HTTP 报文结构

在这里插入图片描述

31.HTTP 状态码

200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误

32.Java IO 模型有哪几种? 简单

33.同步 / 异步,阻塞 / 非阻塞的区别? 简单

34.Netty 了解吗?(不了解……)

35.说几个设计模式?Spring 里面使用到了哪些设计模式? 简单

36.Java 如何实现单例? 简单

37.CAP 理论?

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾

38.分布式事务有哪些实现方式?

2PC两阶段提交协议
2PC是非常经典的强一致、中心化的原子提交协议,协议中定义了两类节点:一个中心化协调者节点和多个参与者节点。2PC分为两个阶段:

准备阶段:

1、协调者向所有参与者发送事务内容,询问是否可以提交事务,并等待所有参与者答复。

2、各参与者执行事务操作,将Undo和Redo信息记入事务日志中(但不提交事务)。

3、如参与者执行成功,给协调者反馈YES,即可以提交;如执行失败,给协调者反馈NO,即不可提交。

提交阶段:

(所有参与者均反馈YES)

1、协调者向所有参与者发出正式提交事务的请求(即Commit请求)。

2、参与者执行Commit请求,并释放整个事务期间占用的资源。

3、各参与者向协调者反馈Ack完成的消息。

4、协调者收到所有参与者反馈的Ack消息后,即完成事务提交。

(任何一个参与者反馈NO)

1、协调者向所有参与者发出回滚请求(即Rollback请求)。

2、参与者使用阶段1中的Undo信息执行回滚操作,并释放整个事务期间占用的资源。

3、各参与者向协调者反馈Ack完成的消息。

4、协调者收到所有参与者反馈的Ack消息后,即完成事务中断。

39.微服务的架构设计是怎样的?

40.网络安全?(随便扯了点被动攻击、主动攻击之类的,这方面懂得不多)

41.Redis 数据类型有哪些? 简单

42.未来的发展方向是怎么考虑的?

43.平时会写文章 / 博客吗? 会

44.有做过其他项目吗?

45.反问环节

知识储备有哪些地方需要补全的?

二、二面 9.3(约 50 min,电话)

二面之前的一天面试官先联系了我,出了一道题目,让我实现一个 Linux Shell 脚本的功能,然后把代码发给他。

//评测题目: 

请用java实现以下shell脚本的功能
uniq -c 记录重复次数
cat /home/admin/logs/biz.log | grep "Login" | uniq -c | sort -nr

假设biz.log内容如下:
User11 Login
User22 Login
User11 Login
User11 22 LogOff

则输出:
User11 Login:2
User22 Login:1

实际上这里有个坑,如果按这条 Shell 命令去执行,得到的结果应当是(CentOS 7):
1 User22 Login
1 User11 Login
1 User11 Login
`原因就在于 uniq 命令是对连续出现的文本进行去重,这里两个 User11 Login 不连续,因此不会被去重。
这个坑导致面试一开始的氛围比较尴尬

1.讨论这个题,面试官一直强调我的代码没有实现它给出的示例输出(明明是你的题目有坑……)。我跟他说如果把 sort 和 uniq 换个位置就能得到它的示例输出。结果面试官说:“你知道这个题是错的,你还往这个错误的方向去实现。”(WTF?这就是阿里味儿吗?i 了 i 了)
2.你做这个题有挑战吗?(反正是开卷做题……谈不上有什么挑战)
3.文件的日志行数是百万/千万级别,还有没有挑战?挑战在什么地方?(生成结果的速度,大文件排序的处理)针对这个数量级怎样去修改算法(多线程 fork-join,join 的时候会遇到什么问题?)
4.你自己写代码会考虑内存占用或者计算资源分配的问题吗?(不会……)
5.线上排查过 JVM 故障吗?看过这方面文章吗?(没有……)
6.数据库了解哪些?
7.提高慢查询性能有哪些方法?
8.看过开源代码吗?
9.看源码有什么收获?(
10.那你为什么说你读的源码不多?(
11.后面的职业发展怎么考虑的?
12.为什么想搞中间件?如果你要搞这个方向,你觉得你应该要学习什么东西?
13.学技术这么久,有没有什么事情让你觉得很自豪?
14.有写过博客或者文章吗?
15.跨专业的跨度大吗?为什么要转行?
16.在项目里的分工和职责?
17.实习期间接触到的技术栈?
18.你的技术亮点是什么?
19.技术之外的方面有什么特长?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Coding路人王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值