Jvm垃圾回收
相关概念
1. 引用计数法(已淘汰)
引用新增+1,释放-1,计数为0释放。
2. 可达性分析算法(根引用)
从GcRoot开始向下搜索,经过的路径为引用链,当对象与GcRoot之间没有引用链则被回收。
GcRoot包括:静态变量(方法区),常量(方法区),局部变量(虚拟机栈)。
1. 强引用:当虚拟机栈中有对象引用时,GC不会回收对象。(如new出来的对象);
2. 软引用:通过SoftRefrence持有,jvm堆内存不足时回收;
3. 弱引用:通过WeekRefrence持有,GC发现即回收;
3. 虚引用:通过PhantomRefrence持有,随时被回收;
3种垃圾回收算法
1. 标记——复制(新生代)
优势:避免了碎片空间;
劣势:需要更多的内存空间;存货对象多时,效率低;
2. 标记——清除(老年代)
劣势:会造成碎片空间;性能不稳定;
3. 标记——整理(老年代)
优势:避免了碎片空间;无需多余的内存空间;
劣势:效率低;
7种垃圾回收器

新生代GC器
1. Serial
单线程;简单高效
2. ParallelNew
多线程;
3. ParallelScavenge
多线程;高吞吐
老年代GC器
1. CMS
回收算法:标记——清除;
特点:多线程(用户线程与垃圾回收线程同时运行);低停顿;性能高;
劣势:存在浮动垃圾;存在碎片空间;对CPU敏感;
过程:1)初始标记:标记和GcRoot直连的对象(存在STW);
2)并发标记:从GcRoot开始遍历,标记存活对象,该过程与用户线程并发运行;
3)重新标记:修正上一阶段中因用户线程运行而导致变动的对象(存在STW);
4)并发清除:清除未标记的对象;
2. Serial Old
回收算法:标记——整理;
特点:单线程;
3. Parallel Old
回收算法:标记——整理;
特点:多线程;
G1收集器
1. 并行与并发
并行:通过多个CPU缩短STW停顿时间;
并发:用户线程与垃圾回收线程并发执行;
2. 分代收集
G1独自管理堆内存。新生代:标记——复制;老年代:标记——整理;
3. 空间整合
无碎片空间
4. 可预测的停顿
Gc时间可设置
jvm常用参数
| 参数 | 举例 | 说明 |
| 堆相关 |
-Xms:1024M |
jvm堆区初始化内存大小(最小内存) |
| |
-Xmx:2048M |
jvm堆区最大可占用内存大小(最大内存),超出这个值,会抛出OOM 注:一般-Xms、-Xmx两个参数会配置相同值 能在Java垃圾回收机制清理完堆区后,不需要重新分隔计算堆区的大小而浪费资源 |
| |
-XX:NewSize:256M |
年轻代初始化内存(优先级高) |
| |
-XX:MaxnewSize:512M |
年轻代最大可占用内存 |
| |
-Xmn |
对-XX:newSize、-XX:MaxnewSize两个参数同时进行配置(优先级中) |
| |
-XX:NewRatio:4 |
设置年轻代:老年代大小比值(优先级低) 4表示年轻代:老年代=1:4,即年轻代占整个堆的1/5 |
| 栈相关 |
-Xss:128K |
每个线程的虚拟机栈的大小 |
| 方法区相关 |
-XX:PermSize=10M |
jvm方法区初始化内存大小 |
| |
-XX:MaxPermSize=10M |
jvm方法区最大可占用内存大小 |
| 其他 |
-XX:TraceClassLoading |
启动在日志中追踪类加载情况 |
| |
-XX:TraceClassUnloading |
启动在日志中追踪类卸载情况 |