垃圾收集器GC
2.1 对象标示死亡算法
引用计数算法
引入一个计数器,被引用一次加1,引用失效减1。优点:算法实现简单、效率高。缺点:无法解决相互循环引用问题(比如A对象引用B,B对象引用A,则当A和B失效,无法回收)。
可达性分析算法
通过GC Roots作为对象起始点,向下搜索引用链接。如果对象从GC Roots无法到达,则代表对象失效,可以回收。
引用关系 | 描述 |
---|---|
强引用(Strong Reference) | new出来的都是强引用 |
软引用(sof Reference) | 将要发生内存溢出时,才会回收 |
弱引用(Weak Reference) | 下一次垃圾回收时,被回收 |
虚引用(Phantom Reference) | 用于对象回收时收到通知 |
finalize
当对象没有与GC Roots相连接的时候,并非此对象会立即死亡(回收)。会执行一次finalize操作,放入一个叫F-Queue队列里面,此队列进行第二次标记,如果此时没有再陪引用,则会被回收。
2.2 垃圾收集算法
算法名称 | 算法描述 | 算法优点 | 算法缺点 |
---|---|---|---|
标记-清除 | 对回收内存进行标记,下次GC的时候一起清除 | 实现简单 | 效率低,内存碎片 |
复制算法 | 预留一块内存,GC时,将未回收对象复制到预留内存中 | 实现简单 | 运行高效;浪费空间(改进:预留内存可以分新生代和老年代);老年代对象效率低 |
标记-整理 | 对回收内存进行标记,下次GC的时候,存活对象向前移动 | 对老年代效率高,解决复制算法的缺点 | 实现复杂 |
分代收集 | 根据对象存活周期分为几块,分别结合上述算法进行回收 | 运行效率高 | 实现复杂 |
2.3 垃圾收集器
结构图
回收器
名称 | 回收机制 | 算法 | 参数 |
---|---|---|---|
Serial | 单线程,主要用于新生代,会导致Stop The World。 | 新生代:复制算法 | 默认新生代回收器 |
ParNew | 多线程,基于Serial的多线程回收机制。主要是新生代采用多线程。 | 新生代:复制算法 | -XX:+UseParNewGC;(ParNew+Serial Old) |
Parallel Scavenge | 新生代收集器,并行多线程。基于吞吐量。 | 新生代:复制算法 | -XX:+UseParallelGC;(Parallel+Serial Old) |
Serial Old | 单线程,主要用于老年代 | 老年代:标记-整理 | 默认老年代回收器 |
Parallel Old | 多线程,主要用于老年代 | 老年代:标记-整理 | -XX:+UserParallelOldGC;(Parallel+Parallel Old) |
CMS | 初始标记-并发标记-重新标记-并发清除 | 老年代:标记-清理 | -XX:+UseConcMarkSweepGC;(ParNew+CMS+Serial Old) |
G1 | 初始标记-并发标记-最终标记-筛选回收。将java堆划分多个Region,使Remembered Set记录引用,这样避免全部扫描。 | 新生代:标记-整理;老年代:标记-整理 |
参数
+PrintGCDetails: 打印GC日志。
SurvivorRatio: 新生代中eden与survivor的比值,默认是8,代表8:1:1的比例。
PretenureSizeThreshold: 大于此参数大小的对象直接晋升老年代。
MaxPretenuringThreshold: 晋升老年代年龄,一次GC之后,年龄加1,超过此参数这晋升为老年代。
UseAdaptiveSizePolicy: 动态调整java堆各个区域大小及进入老年代的年龄。
HandlePromotionFailure: 是否允许担保失败。
ParallelGCThreads: 设置并行GC是的内存回收线程数。
GCTimeRatio: GC时间占总时间的比率,默认为99,即允许1%的GC时间。仅Parallel Scavenge有效。
MaxGCPauseMillis: 设置GC的最大停顿时间,仅Parallel Scavenge有效。
CMSInitiatingOccupancyFraction: 设置CMS在老年代空间被使用多少后触发垃圾收集。默认68%。
UseCMSCompactAtFullCollection: 设置CMS完成回收后是否进行一次碎片整理。
CMSFullGCsBeforeCompaction: 设置CMS若干次回收后再启动一次碎片整理。
2.4 虚拟机性能监控工具
jps
查看java进程的工具,包括类名、参数、jar包等信息。
命令格式:
jps [option] [hosted]
其中option如下:
选项 | 作用 |
---|---|
-q | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启东市传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是Jar包,输出Jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
jstat
用于监视虚拟机各种运行状态信息的命令工具。包括类装载、内存、垃圾收集、JIT编译等运行数据。
命令格式:
Jstat [option vmid [interval[s|ms] [count]]
纯文本的显示,可能使用不及与图形界面的一些检测工具,如VisualVM等。
jinfo
用于查看JVM的一些参数情况,同时可以在运行时修改参数。
jmap
用于生成正在运行JVM的dump文件、heap文件等。
强制生成dump文件命令:
Jmap -F -dump,format=b,file=dump.hprof 24971
强制查看统计对象情况命令:
Jmap -F -histo 24971 | more
jhat
用于分析dump文件的分析器。与jmap对应。
命令格式:jhat dump文件
jstack
查看堆栈信息。
jconsole
图形化的管理工具