每天一套面试题Day16-小米高频(2)
7.说说JVM的垃圾回收算法。
标记-复制(新生,无碎片),标记-清除(老年,有碎片)->标记-整理(老年,无)
8.介绍下双亲委派模型,如何打破它?
双亲委派模型是Java类加载机制,子类加载器先委托父类加载器尝试加载类,父类无法加载时才由自身加载,避免重复加载并保证核心类安全。 类加载器的层次结构:引导类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader),应用类加载(Application ClassLoader),自定义类加载器(Custom ClassLoader)
打破: (1)通过线程上下文类加载器(Thread Context ClassLoader) (2)重写loadClass方法,改变委托逻辑(如不先委托父类,直接自己加载)。 (3)OSGi的动态模块加载,通过Bundle类加载器打破双亲委派,每个模块(Bundle)有独立的类加载器。
9.JDK动态代理是什么?和cglib区别?
我的博客 JDK动态代理和CGLIB都是Java中实现AOP(面向切面编程)的重要技术,它们可以在运行时动态地创建代理对象,用于在不修改原始代码的情况下增强方法功能。
| 对比维度 | JDK动态代理 | CGLIB动态代理 |
|---|---|---|
| 代理原理 | 基于接口实现 | 基于继承实现 |
| 依赖关系 | 目标类必须实现接口 | 目标类可以是普通类 |
| 性能表现 | JDK 1.8+ 性能有大幅优化 | 早期版本性能优势明显,现在差距不大 |
| 生成方式 | 使用JDK自带API生成 | 使用ASM框架生成字节码 |
| 限制条件 | 无法代理无接口的类 | 无法代理final类和方法 |
| 外部依赖 | JDK自带,无额外依赖 | 需要引入CGLIB库 |
Spring AOP的默认策略:
- 如果目标对象实现了接口,默认使用JDK动态代理。
- 如果目标对象没有实现接口,则使用CGLIB。
10.从「敲下一个 URL」到「页面出现在屏幕」整条链路全景
DNS 主机到本地域名服务器递归查询,本地域名服务器,为了完成对客户端的递归查询承诺,向根、顶级、权限域名服务器发起查询,并接收来自它们的迭代查询响应,最终拿到域名对应的IP。
ARP协议,由目的IP得到目的MAC(路由器的MAC)
TCP三次握手建立连接
应用层:生成 HTTP 请求 传输层:TCP 分段,添加端口号 网络层:IP 封装,添加 IP 地址 数据链路层:添加 MAC 地址,形成帧 物理层:转换为比特流传输
由IP协议指路到达服务器
服务器再一层层拆开,拆到应用层,解析,响应经过HTTP应用层,TCP传输层,IP网络层,网络接口层等封装,返回客户端
浏览器解析渲染
TCP四次挥手断开连接 (连接管理:根据 HTTP 版本和头信息决定是否保持连接或关闭,现代HTTP/1.1默认长连接,可能不会立即断开)
作者:我是猫熊 链接:https://www.nowcoder.com/discuss/817499795240546304?sourceSSR=users 来源:牛客网
11.TCP 与 UDP 的 10 大核心区别是什么?
有连接 可靠(序号,ACK,超时重传,拥塞控制,流量控制) 有顺序 基于字节流 基于报文 首部20-60 首部8
TCP面向字节流,UDP面向用户数据报。 TCP首部20-60字节,UDP8字节 TCP三次握手建立连接,四次挥手释放连接.TCP有连接,UDP无连接.所以TCP只支持单播,但是UDP支持组播. TCP可靠,滑动窗口ACK,重发,UDP不可靠。 TCP是有序的,UDP不保证顺序。 所以TCP可以用于准确性要求高的,如FTP,HTTP,UDP支持实时性好的。比如视频流。 TCP有拥塞控制,UDP无。
12.说说 TCP 的三次握手
彼此双方知道序列号,确保对方能收能发 SYN=1,seq=x;ACK=1,ack=x+1,seq=y;ACK=1,ack=y+1,seq=x+1
第二次,ACK = 1, ack = x + 1 (意思是:“你刚才发的序列号x我收到了,我期望你下一个数据从x+1开始发”) SYN = 1, seq = y (意思是:“我也要和你建立连接,我的序列号从y开始”)
#面试真题##坚持#记录刷过的面试真题