1.什么是JVM?
JVM:因为Java源代码到Java的运行分为三部,Java源文件------javac编译成.class文件-------JVM运行,所以JVM就是用来运行Java字节码文件的
JRE:JVM+Java标准类库
JDK:JRE+Java开发工具集
2.JVM内存模型
- 线程私有
- 程序计数器
- 程序计数器的作用有两个:
1.记录程序运行的行号,从而实现代码的流程控制;
2.在多线程的情况下,程序计数器⽤于记录当前线程执行的位置,从⽽当线程被切换回来的时 候能够知道该线程上次运行到哪⼉了。
- Java虚拟机栈
- Java虚拟机是JVM运行Java代码生成的栈叫Java虚拟机栈
- 每一个栈帧中都拥有局部变量表和操作数栈
- 虚拟机栈会遇到的问题:栈内存溢出和堆内存溢出
- 本地方法栈
- 本地方法栈是JVM运行本地方法的时候生成的区域
- 线程共有
- 堆:堆是内存比较大的区域,new出来的对象和数组都在堆中分配内存
是Java回收的主要区域,所以也叫Java堆。
堆分为新生代和老生代,新生代是分为Eden区和Survior区
- 方法区:存放的是已经被加载的类信息、常量和静态变量
方法区从jdk1.8之后就变成 直接内存中的元空间
- 直接内存:直接内存并不会受堆内存的影响,但是 会收到本机内存大小的影响
3.堆内存的分配机制
3.1 对象优先分配进入Eden区
3.2 大对象直接进入老年代
3.3 长期存活的对象进入老年代
4.如何判断这个对象可以回收
4.1 引用计数法
给对象中添加⼀个引⽤计数器,每当有⼀个地⽅引⽤它,计数器就加1;当引⽤失效,计数器就 减1;任何时候计数器为0的对象就是不可能再被使⽤的。
4.2 跟可达算法
通过⼀系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下 搜索,节点所⾛过的路径称为引⽤链,当⼀个对象到 GC Roots 没有任何引⽤链相连的话,则证 明此对象是不可⽤的。
5.垃圾回收算法
5.1 标记清除
⾸先标记出所有不需要回收的对象, 然后回收
问题:内存空间不连续
5.2 标记整理
⾸先标记出所有不需要回收的对象, 让所有存活的对象向⼀端移动 ,然后回收
5.3 复制算法
将内存分为大⼩相同的两块,每次使⽤其中的⼀块,当这⼀块的内存使⽤完后,就将还存活的对象复制到另⼀块去,然后再把使⽤的空间⼀次 清理掉。
这样就使每次的内存回收都是对内存区间的⼀半进行回收。
5.4 分代收集算法
新生代复制算法,老生代垃圾清除或者垃圾收集算法