Hero Image

计算机网络面试核心 7. HTTP 简介 超文本传输协议的主要特点 是应用层的请求响应的无状态协议 支持客户/服务器模式 : 浏览器通过url向服务端发送请求, 服务端返回响应信息 简单快速 : 请求方法 get post delete 通讯速度快 灵活: 数据格式灵活,允许任意格式的数据类型 无连接: 每次连接只处理一个请求,收到应答之后就断开连接 , 1.1 之后使用了长连接 下层实现对上层透明, keep alive 无状态: 对事务处理没有记忆能力,缺少状态, version 1.1 引入了 keep alive 持续连接机制 2.0 升级成本太大 HTTP 请求结构 HTTP请求报文结构 1GET /baidu/com HTTP1.1 2 Host: www.baidu.com 3 Connection:keep-alive # close 1.1之前 4 User-Agent: Mozilla/5.0 5 Accept-Encoding 6Cookie: XXX HTTP响应结构 1HTTP 1.1 200 OK 2 Server: 3 Accept-Ranges: 4 Content-Type: 5 Content-Languge: 6 Content-Length: 7 Date: 请求/响应步骤 客户端连接到WEB服务器 发送HTTP请求 服务器接受请求并返回HTTP响应 释放TCP连接: 服务器主动关闭TCP连接,浏览器被动释放TCP连接 客户端浏览器解析HTML内容 在浏览器地址键入http 开头的url,按下回车之后经历的流程 DNS解析 :逐层查询路由器中的DNS缓存,浏览器-系统-路由器-IPS服务器-根域名服务器缓存-顶级域名服务器缓存,返回对应IP TCP连接:IP+80端口 三次握手 http协议版本 发送HTTP请求: 服务器处理并返回HTTP报文 浏览器解析渲染页面 连接结束 HTTP状态码 1XX:指示信息——表示请求已接收,继续处理

Hero Image

数据库 1. 数据库架构 关系型数据库的主要考点: 架构、 索引、锁、语法、理论范式 范式一: 列不可再分 范式二: 标准键 范式三: 去除传递依赖 如何设计一个关系型数据库 RDMBS 存储管理:尽可能的减少IO,使用块或者页实现 缓存机制:不宜过大,要有淘汰机制 LRU SQL解析:SQL解析 日志管理:记录操作记录 binlog 权限划分: 容灾机制:处理异常 索引管理: 锁管理: 1. 为什么要使用索引? 避免全表扫描,快速查询数据 全表扫描 所有的数据分批次加载到内存 索引 - 对应字典的偏旁部首等 2. 什么样的信息能够成为索引 主键、唯一键、普通键等 3. 索引的数据结构 生成索引,建立二叉查找树今次那个二分查找 生成索引,建立B-Tree进行查找 生成索引,建立B+Tree结构进行查找 生成索引,建立Hash结构进行查找 2. 优化索引- 二叉查找树 二叉查找树 二叉查找树:左子节点小于 根节点, 右子节点大于根节点 平衡二叉树: 左右子树深度的差值不超过1 二叉查找树容易变为线性二叉树 即使使用数的旋转也会出现数的深度递增导致IO的次数增加 3. 优化索引- B-Tree 平衡多路查找树 每个节点有至多m个孩子, M阶B树 定义: 根节点至少包括两个孩子 树中每个节点最多含有有M个孩子(m>2) 除根节点和叶节点外,其他每个节点都至少有ceil(m/2)个孩子 所有的叶子节点都位于同一层 假设每个非终端节点中包含有n个关键字信息,其中 Ki(i=1,…n) 为关键字,且关键字顺序按升序排序Ki-1< Ki 关键字的个数n必须满足:[ceil(m/2) -1]<= n <= m-1 非叶子节点的指针:P[1],P[2],…P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其他P[i]指向关键字属于(K[i-1]K[i])的子树。 让每一个节点尽可能存储更多的信息,尽可能的减少数的深度,从而减少IO的次数

Hero Image

1. 垃圾回收之标记算法 GC 对象被判定为垃圾的标准 没有被其他对象引用 判定对象是否为垃圾的算法 引用计数法 通过判断对象的引用数量决定对象是否可以被回收 每个对象实例都有一个引用计数器,被引用则+1, 完成引用则-1 任何引用计数为0的实例 可以当做垃圾被回收 优点: 执行效率高, 程序受影响比较小 缺点: 无法检测出循环引用的情况,导致内存泄露 可达性分析算法 通过判断对象的引用链是否可达到,来决定对象是否可以被回收 可以作为GC Root的对象: 虚拟机栈中引用的对象(栈帧中的本地变量表) 方法区中的常量引用的对象 方法区中类静态属性引用的对象 本地方法栈中JNI(Native 方法) 的引用对象 活跃线程的引用对象 2. 谈谈你了解的垃圾回收算法 标记-清除法 Mark and Sweep 标记: 从根集合进行扫描,对存活的对象进行标记 清除: 对堆内存从头到尾进行线性遍历,回收不可达对象内存 Mark 阶段 -> Sweep 阶段 存在问题: 碎片化严重,大对象无法找到连续的内存,容易触发下次垃圾回收,outofmemery 复制算法 Coping - 年轻代 适用于对象存活时间比较低的情况 分为对象面和空闲面 对象在对象面上创建 存活对象从对象面复制到空闲面 将对象面所有对象内存清除 有点: 解决了碎片化问题, 顺序分配内存,简单高效,适用于对象存活率低的场景–年轻代 标记整理法 - 老年代 整理: 移动所有存活的对象,且按内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。 优点: 避免了内存不连续,不用设置两块内存互换,适用于存活率高的场景 分代收集算法 垃圾回收算法的组合拳 按照生命周期的不同划分区域, 以采用不同的垃圾回收算法 提高了JVM的垃圾回收效率 Survivor Partitiion 年轻代 复制算法

Hero Image

Java 多线程与并发 1. 进程与线程的区别 关于jdk版本的选择 JDK8,JDK11:Oracle 长期支持 Java线程知识考点 进程和线程的区别 用户态和内核态的转换 进程和线程的由来 串行 初期的计算机只能执行串行执行任务,并且需要长时间等待用户输入 批处理 预先将用户指令集中成清单,批量串行处理用户指令,仍然无法并发执行 进程 进程独占内存空间,保存各自运行状态,相互间不干扰且可以互相切换,为并发处理任务提供了可能 线程 共享进程的内存资源,相互间切换更快捷,支持更细粒度的任务控制,使进程内的子任务得以并发执行 进程和线程的区别 进程是资源分配的最小单位,线程是CPU调度的最小单位 所有与进程相关的资源,都被记录在PCB中 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源 线程只由堆栈寄存器、程序计数器和TCB组成 总结 线程不能看做独立应用,而进程可以看做独立应用 线程有独立的地址空间, 相互不影响,线程只是进程的不同执行路径 线程没有独立的地址空间,多进程的程序比多线程程序健壮 进程的切换比线程的切换开销大 Java进程和线程的关系 - Java对操作系统提供的功能进行封装,包括进程和线程 - 运行一个程序会产生一个进程,进程包含至少一个线程 - 每个进程对应一个JVM实例,多个线程共享JVM里的堆 - Java采用单线程编程模型,程序会自动创建主线程 - 主线程可以创建子线程,原则上要后于子线程完成执行 2. Thread 中start和run方法的区别 start native 方法 openjdk.java.net 调用start() 方法会创建一个新的子线程并启动 run()方法只是一个Thread的一个普通方法的调用 3. Thread 和Runnable 的区别 Thread 实现了Runnable接口的类,使得run支持多线程 Runnable 只有一个抽象方法run 因为单一继承的原则,推荐多使用Runnable结构 4. 如何给run()方法传参 实现方式主要有三种 构造函数传参 成员变量传参 回调函数传参 如何实现处理线程的返回值 实现方式主要有三种 主线程等待法(有多个变量的时候比较难处理,循环等待的时间是不精确的) 使用Thread的join()方法阻塞当前线程以等待子线程处理完毕(粒度不够细) 通过Callable接口是实现: 通过FutureTask 或者 线程池获取 5.