详情提要: 记一次面试题
如果写的有问题麻烦指出哦
一. Java基础
1. ClassLoader的加载过程
- 加载: 通过类的完全限定名查找这个类的字节码文件, 读取这个类的二进制字节流到JVM中, 创建一个Class对象.
- 验证: 通过文件格式、元数据验证、字节码验证、符号引用四种验证方法验证Class文件, 确保字节流中的信息符合虚拟机要求, 不会危害虚拟机安全.
- 准备: 为类变量(主要是静态变量, final变量在编译期就分配了)分配内存并设置初始值为0(比如 static int a = 10, 则初始化为0, 10在下一步初始化), 这里不会为实例变量分配初始化, 类变量会分配在方法区中, 而实例变量会随着对象分配到Java堆中.
- 解析: 将常量池中的符号引用替换为直接引用.
- 初始化: 如果这个类有父类, 则初始化父类, 执行静态初始化器和静态初始化成员变量(前面的static int a), 成员变量也会在这一步被初始化.
2. 堆和栈的区别
-
堆内存用来存放由new创建的对象和数组, 该区域是共享的.
特点是先进先出, 后进后出. 可以动态分配内存大小, 存取速度较慢.
-
栈内存主要是用于执行程序, 包含基本类型的变量和对象的引用变量.
特点是先进后出, 后进先出. 大小需要先确定, 但存取速度较快.
存放栈帧, 每个栈帧对应被调用的一个方法, 其中包括局部变量表, 操作数栈, 指向运行时常量池的引用, 方法返回地址等.
3. 临时变量存在哪里
栈内存
4. 辣鸡回收如何判断一个对象是否需要被回收
根搜索算法(可达性分析)
没有引用计数法! 那是js用的
5. 根搜索算法的起点有哪些
- Java虚拟机栈中引用的对象, 比如局部变量
- 静态属性引用的对象
- 常量引用的对象
- 本地方法栈中引用的对象
二. Spring相关
1. Spring中Bean的作用域
基本作用域(singleton、prototype),Web 作用域(reqeust、session、global session), 自定义作用域.
- singleton: 单例
- prototype: 原型模式, 每次通过容器获取都会产生新的实例.
- request: 对于每次HTTP请求, 使用request定义的Bean都会产生一个新的实例, 且只有在Web应用中使用Spring时, 该作用域才生效.
- session: 每次HTTP中使用session定义的Bean都会产生一个新的实例. 且只有在Web应用中使用Spring时, 该作用域才生效.
- global session: 每个全局的HTTP Session, 使用session定义的Bean都会产生一个新的实例. 典型情况仅在使用portlet context时有效, 且只有在Web应用中使用Spring时, 该作用域才生效.
三. Dubbo和ZooKeeper
1. ZooKeeper的节点类型
- 持久节点: 在节点创建后就一直存在, 直到被删除, 不会因为客户端会话失效而清除.
- 持久顺序节点: 和普通持久节点不同的是每个父节点会为他的第一级子节点维护一份时序.
- 临时节点: 生命周期和客户端会话绑定, 客户端失效时节点自动清除. 且临时节点不能创建子节点.
- 临时顺序节点: 可以用于实现分布式锁.
2. ZooKeeper的节点存储结构
树形结构, 树上的节点可以是文件也可以是目录.
3. 服务注册到ZooKeeper上时是什么类型的节点, 为什么?
临时节点, 连接断开时节点被删除.
4. Dubbo的通讯协议
netty
四. MySQL
1. MySQL有哪些引擎
主要有InnoDB和MyISAM
2. InnoDB和MyISAM的区别
- InnoDB:
- 支持事务处理
- 不加锁读取
- 支持外键
- 支持行锁
- 不支持FULLTEXT类型的索引
- 不保存表行数, 需要全表扫描
- DELETE时是一行一行删
- 数据和索引都存在表空间
- MyISAM:
- 不支持事务, 回滚会造成不完全回滚, 不具有原子性
- 不支持外键
- 支持全文搜索
- 保存表行数
- DELETE时先drop再重建
- 索引和数据分开存, frm存放表结构, MYD存放数据, MYI存放索引
五. Redis
1. Redis常用数据类型
String, Hash, List, Set, ZSet
2. Redis如何设置过期时间
Expire命令
3. Redis如何更换key
Rename