一、对象存活的算法
1、引用计数法
2、根可达性分析算法
二、垃圾回收的算法
1、标记清除算法
2、复制算法
3、标记整理算法
4、分代收集算法
三、垃圾收集器
1、Serial
2、ParNew
3、Parallel Scavenge
4、Serial Old
5、CMS
6、G1
四、垃圾收集器的参数设置
参数 | 描述 |
UseSerialGC | 虚拟机运行在 Client 模式下的默认值,打开此开关后,使用Serial+Serial Old 的收集器组合进行内存回收 |
UseParNewGC | 打开此开关后,使用 ParNew + Serial Old 的收集器组合进行内存回收 |
UseConcMarkSweepGC | 打开此开关后,使用 ParNew + CMS+ Serial Old 的收集器组合进行内存回收。Serial Old 收集器将作为 CMS 收集器出现 Concurrent Mode Failure失败后的后备收集器使用 |
UseParallelGC | 虚拟机运行在 Server 模式下的默认值,打开此开关后,使用 ParallelScavenge + Serial Old (PS MarkSweep)的收集器组合进行内存回收 |
UseParallelOldGC | 打开此开关后,使用 Parallel Scavenge + Parallel Old 的收集器组合进行内存回收 |
SurvivorRatio | 新生代中 Eden 区域与 Survivor 区域的容量比值,默认为8,代表Eden : Survivor=8 : 1 |
PretenureSizeThreshold | 直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配 |
MaxTenuringThreshold | 晋升到老年代的对象年龄。每个对象在坚持过一次 Minor GC 之后,年龄就增加 1,当超过这个参数值时就进入老年代 |
UseAdaptiveSizePolicy | 动态调整 Java 堆中各个区域的大小以及进入老年代的年龄 |
HandlePromotionFailure | 是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden 和 Survivor 区的所有对象都存活的极端情况 |
ParallelGCThreads |
设置并行 GC 时进行内存回收的线程数 |
GCTimeRatio |
GC 时间占总时间的比率,默认值为 99,即允许1%的 GC 时间。仅在使用 Parallel Scavenge 收集器时生效 |
MaxGCPauseMillis |
设置 GC的最大停顿时间。仅在使用 Parallel Scavenge 收集器时生效 |
CMSInitiatingOccupancyFraction |
设置 CMS 收集器在老年代空间被使用多少后触发垃圾收集。默认值为68%,仅在使用 CMS 收集器时生效 |
UseCMSCompactAtFullCollection |
设置 CMS 收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用 CMS 收集器时生效 |
CMSFullGCsBeforeCompaction | 设置 CMS 收集器在进行若干次垃圾收集后再启动一次内存碎片整理,仅在使用CMS 收集器时生效 |
五、监控和故障处理工具
名称 | 主要作用 |
jps | JVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程 |
jstat |
JVM Statistics Monitoring Tool, 用于收集 HotSpot 虚拟机各方面的运行数据 |
jinfo |
Configuration Info for Java, 显示虚拟机配置信息 |
jmap |
Memory Map for Java, 生成虚拟机的内存转储快照(heapdump 文件) |
jhat |
JVM Heap Dump Browser, 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果 |
jstack |
Stack Trace for Java, 显示虚拟机的线程快照 |
1、JPS工具的主要选项(jps [option] [hostid])
选项 | 作用 |
-q |
只输出LVMD,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是Jar包,输出Jar路径 |
-v |
输出虚拟机进程启动时JM参数 |
2、jstat工具的主要选项(jstat [ option vmid [interval [s|ms] [count]] ])
选项 | 作用 |
-class | 监视类装载、卸载数量、总空间以及类装载所耗费的时间 |
-gc |
监视Java堆状况,包括den区、两个 survivor I区、老年代、永久代等的容量、已用空 间、GC时间合计等信息 |
-gccapacit | 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间 |
-gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与- gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
-gcnew | 监视新生代GC状况 |
-gcnewcapacity | 监视内容与- gcnew基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代GC状况 |
-gcoldcapacity | 监视内容与- gcold基本相同,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-compiler | 输出JT编译器编译过的方法、耗时等信息 |
-printcompilation |
输出已经被JT编译的方法 |
3、jmap工具的主要选项(jmap[option] vmid)
选项 | 作用 |
-dump |
生成Java堆转储快照。格式为:dump:iv, Iformat-b,fle- sfilename>其中live子参数说明是否只dump出存活的对象 |
-finalizerinfo |
显示在 F-Queue中等待 Finalizer线程执行 finalize方法的对象。只 在 Linux/ Solaris平台下有效 |
-heap |
显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在 Linux/ Solaris平台下有效 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-permeat |
以 Class Loader为统计口径显示永久代内存状态。只在 Linux/ Solaris平台下有效 |
-F |
当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照。只在 Linux/ Solaris平台下有效 |
4、jstack工具的主要选项(jstack [option] vmid)
选项 | 作用 |
-F |
当正常输出的请求不被响应时,强制输出线程堆栈除堆栈外 |
-l | 显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |