和三年前比起来,我又会了哪些?我在思考这个问题,对技术更自信了,复杂业务处理的更多了,系统设计做的更多了,考虑问题更全面了,但是源码什么的学习程度远远不及三年前。

2022年五年技术面试 - 图1

计算机网络

一台Linux服务器支持多少TCP连接

一个 TCP 连接,需要消耗内存和 CPU,所以到底支持多少个,得看具体的连接数据操作大小了。假设只是空连接的话,那么要消耗 3.3KB 左右。一个 TCP 连接就需要创建一个文件对象,这个有系统级、用户级、进程级的限制,可以设置的。

假设内存是 4GB,一个空连接需要 3.3KB,那么 1024x4x1024/3.3 百万空 TCP 连接不是问题。

操作系统

BIO、AIO、NIO

这里的BIO,AIO,NIO是三种IO模型

BIO
一个线程处理一个请求,会阻塞。

AIO

NIO
所有的请求都注册到一个容器里,然后一个线程去轮询这个容器批量处理。节省了线程的资源,线程的切换,但是轮询会消耗CPU资源,尤其是JDK的NIO实现,当空轮询的时候,CPU会上升的非常厉害。

Java相关

HashMap 和 HashSet 区别

HashSet是基于HashMap实现的,一个实现Set接口,一个实现Map接口,HashSet 添加的是对象,HashMap 添加的是键值对。

ConcurrentHashMap的实现

Java7 中 ConcurrentHashMap 使用的分段锁,也就是每一个 Segment 上同时只有一
个线程可以操作,每一个 Segment 都是一个类似 HashMap 数组的结构,它可以扩容,
它的冲突会转化为链表。但是 Segment 的个数一但初始化就不能改变,默认 Segment
的个数是 16 个。

Java8 中的 ConcurrnetHashMap 使用的 Synchronized 锁加 CAS 的机制。结构也由
Java7 中的 Segment 数组 + HashEntry 数组 + 链表 进化成了 Node 数组 + 链表 / 红
黑树,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红
黑树,在冲突小于一定数量时又退回链表。

线程池大小如何设置?
CPU 密集型任务(N+1): 这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N
(CPU 核心数)+1,比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中
断,或者其它原因导致的任务暂停而带来的影响。一旦任务暂停,CPU 就会处于空闲状
态,而在这种情况下多出来的一个线程就可以充分利用 CPU 的空闲时间。

I/O 密集型任务(2N): 这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线
程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使
用。因此在 I/O 密集型任务的应用中,我们可以多配置一些线程,具体的计算方法是
2N。

中间件

Netty

案例上手Netty
Netty 阅读源码零零散散记录

为什么离职?

在这家公司

资料

2021 Java 大厂面试真题.pdf
[

](https://www.yuque.com/liueleven/nf8ava/gklaat)