内存模型
Java的内存模型有两种
1、JVM分为堆内存和桟内存,堆中存放程序员创建的对象,桟存放执行的方法信息,局部变量和参数等
堆内存所有线程共享,桟每个线程维护各自的内存空间互不影响
所以Java的内存模型是线程安全的
2、多线程共享变量,在主内存里存储的同时,每个线程维护各自的虚拟内存保存该变量副本,优先操作虚拟内存的变量副本,再异步更新主内存,才是JVM内存模型把
垃圾回收
判断算法
引用计数法和可达性分析算法判断,当对象不再被Java程序所引用时,
等待被回收
引用计数方法 + 可达性分析算法是用来判断对象是否处于非活跃状态
引用计数方法:当对象被引用+1,释放引用-1,为0标记为非活跃
可达性分析算法:解决引用计数循环引用问题,即便对象a和b相互引用,只要从GC Roots出发无法到达a或者b,那么可达性分析便不会将它们加入存活对象合集之中。
回收算法
复制,标记清除,标记整理,是用来具体做回收的算法
复制;AB相等的内存,A用来使用,B用来把A的所有活跃对象转移并存储,然后清空A
标记清除:它通过标记所有可达对象,然后清除所有未标记对象的方式进行回收
标记整理:它通过标记所有可达对象,然后让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
回收时机
当JVM判断堆内存空间不足的时候,会使用垃圾回收器,使用判断算法判断哪些对象可以被回收,再使用垃圾回收算法进行具体的回收操作
回收流程
初始标记->并发标记->回收/整理回收
收集器
一般有四种 S P CMS G1
串行 并发 并行并发
1、 使用范围不一样
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用
2、 STW的时间
CMS收集器以最小的停顿时间为目标的收集器。
G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
3、垃圾碎片
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
G1收集器使用的是“标记-整理”算法,进行了空间整合,没有内存空间碎片。
4、CMS会产生浮动垃圾
5、
CMS回收垃圾的4个阶段
初始标记
并发标记
重新标记
并发清理
G1回收垃圾的4个阶段
初始标记
并发标记
最终标记
筛选回收
CMS和G1都是并行并发收集,CMS侧重于尽可能减少主程序停顿时间,G1侧重于设置提前可预知的停顿时间
CMS适合小于6G的回收
G1适合大于6G的回收