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

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

一、一面 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 报文结构


11a5f1ad3e3f4ebb99606a19d730a007.png

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.技术之外的方面有什么特长?

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
63 0
|
2月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
1月前
|
消息中间件 Java 微服务
构建高性能微服务架构:Java后端实践
【4月更文挑战第8天】 在当今互联网应用的快速迭代与高并发挑战下,微服务架构以其灵活性和扩展性成为众多企业技术选型的宠儿。本文将深入探讨在Java后端开发中,如何构建一个高性能的微服务系统,涵盖从基础架构设计、关键技术选型到性能优化策略的全方位分析。我们将透过实际案例,剖析微服务实践中的最佳模式与常见陷阱,为后端开发人员提供一份实操指南。
|
7天前
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。
|
12天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
1月前
|
JSON 前端开发 Java
⚠⚠⚠java后端开发中,前后端联调过程一些常见的低级/低端问题汇总⚠⚠⚠
⚠⚠⚠java后端开发中,前后端联调过程一些常见的低级/低端问题汇总⚠⚠⚠
|
1月前
|
安全 Java 持续交付
构建高性能微服务架构:Java后端的实践之路
【4月更文挑战第8天】 在现代软件开发领域,微服务架构已经成为提高系统可维护性、扩展性和技术栈独立性的关键解决方案。本文将深入探讨如何利用Java后端技术构建一个高性能的微服务系统。我们将重点讨论微服务设计原则、系统拆分策略、关键性能优化技巧以及安全性考虑。通过实际案例分析,揭示如何在保证系统稳定性的同时实现敏捷开发和部署。
|
2月前
|
SQL 前端开发 Java
Java后端进阶之路: JavaWeb(四)
Java后端进阶之路: JavaWeb
35 1
|
XML SQL Java
Java后端进阶之路: JavaWeb(三)
Java后端进阶之路: JavaWeb
35 1
|
2月前
|
前端开发 Java 应用服务中间件
Java后端进阶之路: JavaWeb(二)
Java后端进阶之路: JavaWeb
78 1