5pyx55CG5ri4 / 5pyx55CG5ri4.github.io

0 stars 0 forks source link

Java-面试总结-持续更新 #11

Open 5pyx55CG5ri4 opened 3 months ago

5pyx55CG5ri4 commented 3 months ago

Java基础

集合

List

arraylist new初始容量为0 空数组 add第一个元素 扩容到10 后续每次扩容1.5倍左右 底层是数组复制来实现

map

hashmap 1.7 数组+链表 1.8数组+链表+红黑树
初始容量16 负载因子0.75(意味着容量到了百分之75的时候扩容) 当出现hash冲突 会使用拉链法解决冲突 如果同一个hash结果 key不同 进入链表 如果链表长度达到8 则转化为红黑树 转换前会判断数组长度是否大于64 如果小于64则会先对数组进行扩容 hashmap每次扩容是2倍 2的次幂

io

多线程

开启多线程的几种方式

继承线程类或者实现接口

线程的生命周期

  1. 准备状态 如new thred 未调用start方法时

  2. 就绪状态 调用了start方法 等待cpu资源

  3. 运行状态

  4. 阻塞状态 调用了sleep方法或者 wait方法

  5. 线程结束

    线程池参数

  6. 核心线程数

  7. 最大线程数

  8. 工作阻塞队列

  9. 空闲线程存活时间

  10. 存活时间单位

  11. 拒绝策略

  12. 线程工厂(不重要)

    线程池执行流程

    一个任务进来 先开核心线程数是否超过设置的数量 如果没有 由核心线程执行任务如果核心线程数超过了设置的数量 则加入工作队列等待 如果 工作队列满了 并且没超过最大线程数 则开启临时新线程执行 临时线程存活时间由参数控制 回收 如果工作队列满了并且超过了最大线程数 则走拒绝策略

    ThredLocal

    在每个线程中都有独立的一个thredlocalmap key为thredlocal value为存储的值 其中 key为弱引用 需要手动清理 否则可能会导致内存泄漏问题

    sleep,wait

    sleep是thred类的方法 作用是 休眠当前线程 无需唤醒
    wait是object类方法 作用是是当前线程阻塞等待 在无参的方法中 需要等待别人唤醒

    锁机制

    volatile,sychronized和reentrantLock

    volatile 关键字修饰变量 可以保证变量对每个线程的可见性 不加关键字 线程中读取的变量为从主内存复制的副本 加了关键字修饰 则直接读取主内存中的值
    sychronized jvm提供的锁 为关键字 锁住的是对象头 分为 偏向锁 轻量级锁 自旋锁 重量级锁 是可重入锁 无法实现公平锁 无需手动释放锁
    reentrantLock 是类 java提供的锁api 底层是aqs 锁的是int类型的state值 可重入锁 可实现公平锁和非公平锁 无参构造的是非公平锁 需要手动释放锁

    AQS

    aqs底层是一个双向队列和一个state信号量 java juc基本都依赖aqs框架 主要维护 信号量放行的逻辑

    CAS

    比较并替换 可实现 乐观锁

    类加载机制

    类加载过程

  13. 加载:加载class文件

  14. 连接:1.验证 验证class文件合法性 2.准备 为变量设置内存并赋初始值 3.解析

  15. 初始化

    双亲委派机制

    加载类的时候 会先向父类加载器找有没有加载过这个类 如果没有 则继续往上 如果加载过了 则直接使用父类加载的结果 直到到达顶级 再向下尝试加载
    好处 保护程序稳定 防止重复加载 防止java 核心 api被篡改 如自己定义string类

    如何打破双亲委派

    自定义类加载器 重写加载方法

    JVM

    内存区域

    程序计数器 线程私有 记录代码运行位置 控制流程
    栈 分为虚拟机栈和本地方法栈 线程私有 方法开始压入栈帧 退出弹出栈帧
    堆 线程共享 存储对象 gc重要位置 分为 新生代和老生代 新生代分为ende区 s0 s1
    方法区/元空间 线程共享 存储 类信息 常量等信息
    直接内存

    GC

    判断是否为垃圾的算法
    1.引用计数法 有对象引用时+1 引用被清理时-1 引用为0 则为垃圾 弊端 无法解决循环引用问题
    2.可达性分析法 从gc root开始往下找 找不到的对象均为垃圾 何为gcroot? 栈中引用的对象 方法区中静态属性和常量引用的对象 被同步锁持有的对象

垃圾回收算法:
标记清除法 先标记需要清理的对象 再一次性回收 弊端 会造成大量的空间碎片
标记复制法 将内存分为两大块 将需要回收的对象复制到空的内存块 再清理 弊端 内存消耗过大
标记整理法 将需要清理的内存标记 再将所有存活对象往一端移动 然后清理端边界的对象

垃圾回收器:
串行垃圾回收器 原始版本 stw时间长 单线程垃圾回收 适用于小内存
并行垃圾回收器 串行的衍生版本 唯一不同的是垃圾回收时 多线程并行 减少stw时间
cms
g1

频繁出现GC的原因

cpu负载过高
大对象太多
老年代内存不足导致 频繁full gc

spring

ioc

控制反转和依赖注入 原理是反射

aop

切面 原理是反射和动态代理 生成动态代理对象 可对方法执行前和执行后进行拦截做处理

bean的作用域

单例 默认 bean容器中所有bean都是唯一的
多例 每次获取都是一个新bean
requset 每个请求都是一个新bean
session 每个session都是一个新bean

bean的生命周期

  1. 实例化

  2. 属性设置

  3. 前置处理

  4. 初始化处理

  5. 后置处理

  6. 使用中

  7. 销毁前置操作

  8. 死亡

    springmvc

    springmvc执行流程

    请求过来 先到 调度servlet 由调度servlet找到处理器 handmapping 然后适配处理器 然后调用处理器找到对应的控制器 然后由控制器返回视图 渲染视图

    springboot

    springcloud

  9. Nacos 注册中心

  10. Ribbon 负载均衡

  11. OpenFeign 程序通信 http接口调用

  12. Sentinel 降级 限流 服务保护

  13. Gateway 网关 鉴权

  14. Seata 分布式事务 二阶段提交 AT模式和TCC模式

    mybatis

    redis

    mq

    事务消费

    顺序消费

    mysql

    常见锁

    共享锁 读锁 排他锁 写锁 间隙锁 行锁 表锁等

    数据引擎

    myisam和innodb的区别
    myisam 不支持事务 文件存储分为两个文件 索引文件和数据文件分开
    innodb 支持事务 文件存储 一个文件 索引和数据都在一个文件中 mysql默认

    索引

    普通索引 唯一索引 innodb中的主键索引(聚簇索引,特殊的唯一索引),联合索引,全文索引
    底层B+Tree 多叉平衡树 叶子节点中有指针相连 节点有序
    索引覆盖 所需要查询的字段都建立了索引 不需要回表查询
    最左匹配原则 如果联合索引 abc三个字段 那么查询的时候必须要有a这个字段的做为条件 才会走联合索引 因为存储索引的时候是按照从左往右按大小排序的

    事务特征

    A原子性 同时成功同时失败
    C 一致性 事务要保持最终一致性 一致性需要 其他三个特征来保证
    I 隔离性 根据事务隔离级别控制 保证不同事务的隔离性
    D 持久性 事务最终需要持久化到数据库中

    事务隔离级别

    读未提交 会产生脏读 级别最低 可以读到未提交的事务
    读已提交 不可重复读 两次查询可能会产生不一样的结果
    可重复读 mysql默认 会产生幻读 每次读取结果都一样
    可串行化 级别最高 并发性能低 所有事务串行进行

    mvcc

    在不可重复读和可重复读的事务隔离级别中有效 用来保证 事务的并发性
    原理是通过版本链来控制 在每个表中有两个隐藏字段 一个是事务id一个是上个版本的地址快照
    不可重复读中 每次查询都会生成新的 readView 所以会产生两次查询不一样
    可重复读中 会使用上次的readView 所以每次读取结果都一样

    mysql 锁等待超时

    limit 大数据量优化

    liunx

    1. 常用命令
    2. 远程复制的命令 scp 传输文件夹 -r

数据加密

  1. 加密方式
  2. 对称加密和非对称加密
  3. 国密

last:20240625 last:20240910