JAVA虚拟机学习笔记2-垃圾收集器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

图形化的管理工具

jisualVM

猜你喜欢

转载自blog.csdn.net/linwu_2006_2006/article/details/94738908