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 | 
启动在日志中追踪类卸载情况 |