面试-jvm
字节
1B(字节) = 8 bit(比特/位)
基本数据类型
1.boolean
2.char 2B
3.byte 1B
4.short 2B
5.int 4B
6.long 6B
7.float 4B
8.double 8B
接口与抽象类
一个类可以 implement 多个接口 ,但只能extends一个抽象类
==与equals
== 判断地址
equals 类没有覆盖 equals() ⽅法。则通过 equals() ⽐该类的两个对象时,等价于通过“”⽐这两个对象。
判断基本数据类型等于,因为重写了equals方法
重写 equals 时必须重写 hashCode
== 基本类型比较值,引用类型比较内存地址
equal 只能是引用类型调用, 重写过比较值,没重写比较内存地址
jvm
方法区(永久代/元空间)类信息 静态变量、常量
堆 实例对象
本地法栈 c语言方法
虚拟机栈 每个线程会创建一个虚拟机栈 每个方法会创建一个栈帧 每个栈帧包含局部变量表、操作数栈、常
量池引⽤等信息。
程序计数器 程序执行到哪一行
老年代 2/3 新生代1/3 伊甸区8/10 from1/10 to 1/10
引用计数法 和 可达性分析算法
强引用 、软引用 、 弱引用 、虚引用
- 标记清除
- 标记复制 年轻代
- 标记整理
垃圾收集器:CMS 和 G1 Serial、ParNew
类加载机制
双亲委派模型
Java 内存模型与线程
volatile 可见性和有序性 只能用于变量
synchronized 原子性,可见性
线程安全与锁优化
互斥同步、非阻塞同步
Java编译到执行的过程
编译->加载->解释->执行
编译:「语法分析」「语义分析」「注解处理」
比如对泛型的擦除和我们经常用的Lombok就是在编译阶段干的
加载 装载->连接->初始化
- 装载: (装载时机->装载发生->装载规则)
装载这个阶段它做的事情可以总结为:查找并加载类的二进制数据,在JVM「堆」中创建一个java.lang.Class类的对象,并将类相关的信息存储在JVM「方法区」中- 装载时机:
- 装载发生: 双亲委派机制
- 双亲委派机制
根加载器(Bootstrp loader):java核心类库
扩展加载器(ExtClassLoader ):扩展包类库
系统加载器(AppClassLoader ):当前应用的classpath下的所有类
自定义ClassLoader
那只要我自定义个ClassLoader,重写loadClass方法(不依照往上开始寻找类加载器),那就算是打破双亲委派机制了。
- 双亲委派机制
- 装载规则: JDK 中的本地方法类一般由根加载器(Bootstrp loader)装载,JDK 中内部实现的扩展类一般由扩展加载器(ExtClassLoader )实现装载,而程序中的类文件则由系统加载器(AppClassLoader )实现装载。
- 连接: (验证->准备->解析)
对class的信息进行验证、为「类变量」分配内存空间并对其赋默认值。- 验证: 验证类是否符合 Java 规范和 JVM 规范
- 准备:为类的静态变量分配内存,初始化为系统的初始值
- 解析:将符号引用转为直接引用的过程
- 初始化:为类的静态变量赋予正确的初始值。
- 收集class的静态变量、静态代码块、静态方法至()方法
- 执行构造器
- 为静态数据赋值
解释:把字节码转换为操作系统识别的指令
在解释阶段会有两种方式把字节码信息解释成机器指令码,一个是字节码解释器、一个是即时编译器(JIT)。
- 直接解释
- 编译解释
执行:操作系统把解释器解析出来的指令码,调用系统的硬件执行最终的程序指令。
认证授权
cookie 浏览器保存
session 服务器保存,传一个sessionId给cookie
token ⼀般会选择存放在浏览器的cookie 或 local storage 中 能解决CSRF(Cross Site Request Forgery)⼀般被翻译为 跨站请求伪造
不论是 Cookie 还是 token 都⽆法避免跨站脚本攻击(Cross Site Scripting)XSS。
JWT
JWT 由 3 部分构成:
- Header :描述 JWT 的元数据。定义了⽣成签名的算法以及 Token 的类型。
- Payload(负载):⽤来存放实际需要传递的数据
- Signature(签名):服务器通过 Payload 、 Header 和⼀个密钥( secret )使⽤ Header ⾥⾯指
定的签名算法(默认是 HMAC SHA256)⽣成。
在基于 Token 进⾏身份验证的的应⽤程序中,服务器通过 Payload 、 Header 和⼀个密钥( secret )创
建令牌( Token )并将 Token 发送给客户端,客户端将 Token 保存在 Cookie 或者 localStorage
⾥⾯,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie ⾥⾯⾃动发送,但是这
样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中: Authorization: Bearer
Token 。
主题模型
加粗
颜色
- 无序列表
- b
- c
- b
- d
- ds
- dasdd-
- ds