滴滴Java一面
线程数量的合理配置取决于任务类型(CPU 密集型、IO 密集型)和系统资源(CPU 核心数、内存)。
- CPU 密集型任务定义:任务主要消耗 CPU 资源(如计算、加密、解码)。最佳线程数:线程数 = CPU 核心数 + 1(额外 1 个线程用于处理可能的页缺失等异常情况)
复制代码
1 |
|
- IO 密集型任务定义:任务主要等待 IO 操作(如数据库查询、网络请求、文件读写)。最佳线程数:线程数 = CPU 核心数 × (1 + 平均等待时间 / 平均处理时间)或简化为 线程数 = CPU 核心数 × 2(经验值)示例:若平均等待时间是处理时间的 3 倍,CPU 核心数为 8,则线程数 = 8 × (1 + 3) = 32。
- 混合型任务策略:若可拆分,将任务拆分为 CPU 密集型和 IO 密集型子任务,分别使用不同线程池;否则按 IO 密集型任务处理。
4.JVM内存区域
主要分为七个部分
- 程序计数器
- Java 虚拟机栈
- 本地方法栈
- 堆
- 方法区
- 运行时常量池
- 直接内存
5.递归爆异常是属于哪个区域的溢出?
递归爆栈属于是栈溢出
因为递归是不断执行方法
函数调用会进栈 过多导致栈溢出
最终抛出 StackOverflowError 异常
JVM 栈 通常为 1mb 我们可以通过-Xss 参数调整
Java 线程执行时会为每一个线程分配独立的栈空间
用于存储一系列数据 例如方法的局部变量表,方法的返回地址
每个方法调用会创建一个栈帧 我们在递归调用时会不断压入新栈帧 直到内存耗尽
6.Java异常处理机制
Java 的异常处理机制基于 Throwable 类
大体分为两类
Error 错误 由 JVM 处理
Expection 异常 分为可检查异常 运行时异常
异常很重要 在我第一次实习的时候 因为每次都不写异常 还被批了
try - catch - finally
catch 作为捕获异常 我们需要按照子类在前 父类在后的顺序排列
在方法后加上 throws 表示可能抛出的异常 由调用者处理
也可以在 catch 的语句体里面用 throw 手动抛出
自定义异常可以继承 Expection 和 RuntimeExpection 并且在构造方法里将信息通过 super() 向上传
finally 里优先保证 try-with-resources 语法 保证资源正常退出 避免内存泄漏
7.AOP的实现原理
8.Spring循环依赖怎么解决?
循环依赖是我们从 ioc 容器注入 bean 的时候
造成的一种类似于死锁的情况
如果是构造器注入
我们可以使用@ Lazy 注解
转载作者:我是Dduo不是dduo