jvm优点
write once run everywhere!
HelloWorld.java
| jvm编译
HelloWorld.class
| jvm翻译成机器认识的机器码
1.机器码翻译
2.内存管理
缺点
我们把内存管理交给了jvm做,那么就会产生内存相关的问题(内存溢出、内存泄露),
这时,我们就需要优化
运行时数据区
内存模型
新生代 1
老年代 2
永久代(<1.8)
meta space(1.8)
判断对象是否可以被回收(gc)
1.引用计数法(缺点:循环引用回收不了)
2.GC ROOTS,可达性分析
什么样的对象可以作为GC ROOTS ???
- 虚拟机栈中本地变量表引用的对象
- 方法区中:
类静态变量应用的对象
常量引用的对象
为什么他们可以作为GC ROOTS呢?不能被回收的对象
不可达是不是一定会被回收?
finalize()方法,再做一次挽救
引用
强引用 Object obj = new Object();
软引用 SoftRefence
弱引用 只要回收,就会被回收
虚引用 回收前会被通知
回收算法
标记清除法
- 效率不高
- 产生空间碎片
复制算法
- 空间利用率不高
标记整理法
- 不会产生空间碎片
分代收集
垃圾收集器(垃圾回收算法的具体实现)
STW stop the world
Serial收集器(串行)
- 只有一个gc线程,其他业务线程挂起
ParNew (并行)
- 多线程gc
Parallel Scavenge 收集器(并行)
- 吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
Serial Old
- cms的备用方案
Parallel Old 收集器(标记整理算法)
CMS收集器(标记清除算法)
- 减少回收停顿的时间
- 1.初始标记
- 2.并发标记
- 3.重新标记
- 4.并发清除
- 产生空间碎片,当到达一定程度时,启用Serial Old
G1收集器