按照金字塔原理
一、JVM的内存结构
程序计数器、虚拟机栈、本地方法栈、堆区、方法区。
其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭。垃圾收集器在对堆区和方法区。
二、垃圾回收算法
基础:
1.引用计数算法:引用该对象的个数,为0可被回收。
2.可达性算法分析
2.1 不可达情况 进行两次标记,finalize方法可能重新建立连接
3.java中的 强、软(溢出回收)、弱(下一次GC回收)、虚引用
算法
1.标记-清除算法
直接回收不存活,优点:高效 缺点:内存碎片
2.复制算法
将堆区分为 对象区 和 空闲区,将可达的对象拷贝到空闲区,然后清空对象区中所有不可达。
3.标记-整理算法
进行标记清除算法后,移动存活的对象。
4.分代收集算法
young 新生代 tenured 老年代 parment永久代
young代
8:1:1的 eden区 和 survivor0 和 survivor1
新生对象在eden区,开始GC时 ,
将eden存活拷贝到survivor0,清空eden
survivor0满了,将eden survivor0拷贝的survivior1 然后交换 0 和 1. 保持1 为空。
如果1不足以存放0和eden,存放到old,如果old满了 直接full GC
新生代发生的GC 叫做minor GC 频率高。
年老代
内存满时发生 major 即 full GC
HotSpot虚拟机包含的所有收集器
- Serial收集器(复制算法)
- Serial Old收集器(标记-整理算法)
- ParNew收集器(停止-复制算法)
- Parallel Scavenge收集器(停止-复制算法)
- Parallel Old收集器(停止-复制算法)
- Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先。
- CMS(Concurrent Mark Sweep)收集器(标记-清理算法)
JVM调优的过程中,很大一部分工作就是对于Full GC的调节 减少 FULL GC
Full GC:
a) 年老代(Tenured)被写满;
b) 持久代(Perm)被写满;
c) System.gc()被显示调用;
d) 上一次GC之后Heap的各域分配策略动态变化;