亚马逊的研发岗位叫做SDE,我面试的就是这个岗位。
一面:
1 多线程的通信,同步方式。面试官问我 volatile 和 synchronized 的区别。 我从底层原理方面讲了两者的实现方式,主要解释了 synchronized 基于 mutex lock 实现,重 量级锁,需要从用户态切换到内核态。volatile 则是通过插入内存屏障的方式,保证变量读 写的可见性。
2 集合类用过哪些 当时回答的是 ArrayList,linkedlist,hashmap 这类简单的集合类,于是面试官就问了 hashmap 的实现原理,以及和 chm 的比较,不同版本 JDK 的区别。也是比较老生常谈的问题了。
3 JVM 的内存模型 说完内存模型的主要情况,面试官开始问我关于内存泄漏和内存溢出相关的问题,也比较简 单,另外还问了 GC 相关的问题。
4 NIO 和 BIO 的区别 主要就是讲述 BIO 的阻塞式 IO 读写,然后讲一下 NIO 的实现原理,相关类,并且说到 IO 多 路复用的实现方式,底层的 epoll 实现方式等等。
5 算法题:实现一个 LRU 只要求实现超过容量时的缓存淘汰,不用处理缓存超时的问题,所以只要写一个双向链表来 存节点即可。另外,不能直接使用 linkedhashmap 实现,所以直接用 hashmap 作为成员变量, 另外写一个含有容量参数的构造方法即可,也是比较常见的问题了。
6 n 个有序链表合并,怎么实现。 刚开始说的是直接合并,然后优化使用多机进行。后来看了一下,可以用最小堆实现。
二面:
这轮是经理面
1 项目
2 项目的多线程问题
3 项目的架构
4 项目的数据库使用,部署方式,缓存部署方式。
5 项目的实际场景
6 讲一下 JVM 的内存分区
7 秒杀系统架构设计 秒杀系统设计也是一个比较常见的问题了。一般可以分几个方面作答。 首先,前端限制访问时间,以及同一 IP 的访问次数。 然后,第一层的服务做负载均衡,比如使用 nginx,然后服务器做集群。 接着,可以用消息队列做削峰和限流,然后做一层缓存,最后只有少量请求到达数据库。 面试官问 nginx 怎么做高可用,前一层能不能再做负载均衡,我回答的是 nginx 也做集群, 前一层可以用硬件负载均衡或者 dns 服务器做第一层负载均衡。 另外面试官还问了如果有 ddos 攻击怎么办,我刚好想到通过人机验证来避免大量肉鸡的攻 击,于是就说了验证码的方式,面试官也说可以。
8 Redis 的分布式部署 说了 Redis cluster 的部署方式,其实就是分片加哨兵的部署方式,另外 Redis 还可以使用 codis 这类***来做分布式。
9 MySQL 的主从部署,读写分离。 这个就是比较常见的 MySQL 部署方案了,稍微说了一下实现方式就没再问了。
10 cap 定理 讲了一下为什么三者只能选两者,这个问题还是挺绕的。 11 负载均衡怎么做
12 kafka 的作用,持久化,其他问题 kafka 之前看了一些比较好的文章,但是时间一久就忘了,于是我就说了读写性能好,以及 多个副本的部署方式。
13 前端解决一些无效的请求过滤,怎么做
14 有什么 offer,为什么想要换工作,工作不注重稳定性吗?想去哪里工作。
全部评论
(7) 回帖