垃圾回收算法
引用计数(Refrence Counting)
对象有一个引用,即增加一个计数,删除一个引用减少一个计数,无法处理循环引用的问题
复制算法(Copying)
此算法把内存划分为两个空间,每次只使用一个空间,垃圾回收时,遍历当前使用的区域,把正在使用的对象复制到另一个区域,清空当前区域,
缺点:需要使用两倍内存空间
标记清除(Mark-Sweep)
第一阶段 从引用根节点开始标记所有引用对象
第二阶段 遍历整个堆,清除未标记的引用对象
标记整理(Mark-Compact)
第一阶段 从引用根节点开始标记所有引用对象
第二阶段 遍历整个堆,把清除未标记对象并且把存活对象压缩到堆的一块,按顺序排放
其他算法
分代算法 等
垃圾收集器
Scavenge GC (次收集)和full GC(全收集)
Scavenge GC 发生在新生代
Full GC 老年代GC 至少触发一次 Minor GC
次收集
当年轻代
堆空间紧张会触发
相对于全收集,收集间隔较短
全收集
当老年代
或持久代
堆空间满的时候会触发
System.gc 可以显示调用全收集
全收集一般根据堆大小的不同,需要时间不尽相同,调用时间长,但不应超过3-5秒
分代垃圾回收器
young generation | tenured generaion |
---|---|
serial | cms(concurrent mark sweep) |
ParNew | Seraial Old |
parallel scavenge | Parallel Old |
G1(gabage first) | G1(garbage first) |
新生代收集器
Serial串行收集器
Serila 实在Hotspot在client模式下默认垃圾收集器
,暂停其他所有工作线程(STW
)
可以使用 XX:+UseSerialGC打开
ParNew并行收集器
- 多个线程收集
- 是VM启用CMS收集器 xx:+UseConcMarkSweepGC默认新生代收集器
- 在单CPU中比不过Serial
- 收集线程与CPU数量相同
Parallel Scavenge收集器
- 与ParNew类似
- 复制算法
- 并行多线程收集器
- 关注系统吞吐量
系统吞吐量 = 系统运行用户代码时间 / 系统运行用户代码时间 + 垃圾处理器时间
老年代收集器
Serial Old收集器
标记-整理
算法单线程
收集器
CMS收集器
并发
收集器最短
回收停顿时间
为目标收集器
分区收集 G1收集器
- 面向服务端应用的收集器
JVM优化
- jps
- jstat
- jinfo
- jmap
- visualvm 插件 visual gc
JVM 参数
-
-Xms 初始化堆大小
-
-Xmx 最大堆大小
-
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
-
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
-
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-
-XX:NewRatio:新生代和老年代的比
-
-XX:ParallelCMSThreads:设定CMS的线程数量
-
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-
-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
-
-XX:+UseParNewGC:在新生代使用并行收集器
-
-XX:+UseParallelGC :新生代使用并行回收收集器
-
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
-
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
-
-Xms:设置堆的最小空间大小。
-
-Xmx:设置堆的最大空间大小。
-
-XX:NewSize设置新生代最小空间大小。
-
-XX:MaxNewSize设置新生代最大空间大小。
-
-XX:PermSize设置永久代最小空间大小。
-
-XX:MaxPermSize设置永久代最大空间大小。
-
-Xss:设置每个线程的堆栈大小
-
-XX:NewRatio设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-
-XX:SurvivorRatio年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5