后端技术面试38讲
内容来自极客时间专栏课
01-程序运行原理:程序是如何运行又是如何崩溃的?
- 存在磁盘上的代码没有价值, 运行起来才有价值
- 先要编译
- 堆是无序的内存空间
- 执行上下文信息
- 因为CPU的分时共享技术, 可以分时处理进程的信息, 多核架构也可以实现并发.
- CPU有运行, 就绪, 阻塞状态
- 当进程在CPU上运行就处于运行状态
- 当进程获得了除了CPU以外的资源就是CPU就绪状态, 就等他了
- 服务为什么会变慢?
- 起线程是在tomcat里面进行的
- 多个线程访问的共享资源称为临界区, 需要加锁
- 解决因高并发导致的响应变慢手段是分布式结构
- 缓存, 限流, 消息队列, 降级
02-数据结构原理:Hash表的时间复杂度为什么是O(1)?
- hash表的物理存储是数组
- 通过对key hash存在数组的位置
- 但是会有hash冲突, 数组中存储的是数据元素的指针, 虽然有相同的下标, 找到位置之后再遍历链表找到key就可以了
- 如果所有的数组下标都冲突就是退化成链表
- 当对数组链表这种线性结构加上限制就成了栈, 队列
- 栈和队列都是操作受限的线性表
- 阻塞队列, 队头阻塞
- 数组、链表、栈、队列都是线性表,也就是每个数据元素都只有一个前驱,一个后继。而树则是非线性表,树是这样的。
- 软件开发中,也有很多地方用到树,比如我们要开发一个OA系统,部门的组织结构就是一棵树;我们编写的程序在编译的时候,第一步就是将程序代码生成抽象语法树。传统上树的遍历使用递归的方式,而我个人更喜欢用设计模式中的组合模式进行树的遍历
03-Java虚拟机原理:JVM为什么被称为机器(machine)?
- JVM的全称是Java Virtual Machine
- 这样一个程序为什么被称为机器(Machine)呢?
- 无状态对象, 幂等即使线程不安全也没事
- JVM更像是一个操作系统, 而且比操作系统更进一步
- 标记引用是否可达
- 清理并不是马上都清理的, 但是这不是连续的, 压缩, 复制
- 回收前:
- 清理:
- 压缩
- 复制:
- JVM还会采用分代回收, JVM将堆空间分为新生代和老年代, 创建对象只在新生代创建
- 当经过几次垃圾回收依然存活就会被放到老年代(孤儿院), 当老年代已经满了, 就会触发全量的垃圾回收, fullGC.合理设置新生代和老年代的比例对垃圾回收的性能有重要影响
- JVM的垃圾回收器有四种
- 第一种是Serial 串行垃圾回收器
- 第二种是Parallel 并行垃圾回收器
- 第三种CMS 并发垃圾回收器
- 最后一种是G1 垃圾回收器
它将整个堆空间分成多个子区域,然后在这些子区域上各自独立进行垃圾回收,在回收过程中垃圾回收线程和用户线程也是并发运行。G1综合了以前几种垃圾回收器的优势,适用于各种场景,是未来主要的垃圾回收器。
- 分治思想
- StackOverflowError,我们就知道是线程栈空间不足,栈空间不足通常是因为方法调用的层次太多,导致栈帧太多。
- 执行引擎在执行字节码指令的时候,是解释执行的,也就是每个字节码指令都会被解释成一个底层的CPU指令,但是这样的解释执行效率比较差,JVM对此进行了优化,将频繁执行的代码编译为底层CPU指令存储起来,后面再执行的时候,直接执行编译好的指令,不再解释执行,这就是JVM的即时编译JIT。Web应用程序通常是长时间运行的,使用JIT会有很好的优化效果,可以通过-server参数打开JIT的C2编译器进行优化。
04-网络编程原理:一个字符的互联网之旅
- 我们现在开发的应用都是互联网应用
- IP internetProtocol 互联网协议
- 我们之所以能上网是因为运营服务商为我们提供了互联网服务
- CDN: 内容分发网络, app请求数据最先到达的是运营商机房, 为了提升访问速度会在运营商机房缓存一些文件
- TCP只是负责数据都以bit流的形式发给你, 其他什么东西都是上层的HTTP协议干的事
- 存控制Cache-Control、响应过期时间Expires
- Content-Length参数声明body的长度。
- TCP仅仅是一个传输层协议
- 应用层、表示层、会话层合并为一个应用层
- IP协议不是一个可靠的通信协议,并不会确保数据一定送达。要保证通信的稳定可靠,需要传输层协议TCP
- SYN ACK
- TCP是端口
05-文件系统原理:如何用1分钟遍历一个100TB的文件?
- 数据库文件不是连续存储的, 日志文件则是连续的
- 盘片 主轴 磁头臂
- linux的文件信息: inode文件的元数据
- RAID磁盘冗余阵列
- 常用RAID有五种,分别是RAID 0、RAID 1、RAID 10、RAID 5和RAID 6。
- 分布式文件系统 : HDFS 的NameNode就是Linux的inode
06-数据库原理:为什么PrepareStatement性能更好更安全?
- PrepareStatement预编译
- 这种通过非聚簇索引找到主键索引,再通过主键索引找到行记录的过程也被称作回表。
07-编程语言原理:面向对象编程是编程的终极形态吗?
08-软件设计的方法论:软件为什么要建模?
- 阿里的工程师在创造一个“500平方公里”的交易市场,百度的工程师在创造一个“一万层楼”的图书馆,新浪微博的工程师在创造“两亿份报纸”,腾讯的工程师在创造“数10亿个聊天茶室和棋牌室”