GC参数:
-XX:+PrintGC 打印GC信息
-XX:+PrintGCDetails GC详细信息
-XX:+PrintHeapAtGC 堆使用的信息
-XX:+PrintGCTimeStamps 虚拟机启动后的时间偏移量
-XX:+PrintGCApplicationConcurrentTime 应用程序执行时间
-XX:+PrintGCApplicationStoppedTime 程序由GC停顿的时间
-XX:+PrintReferenceGC (软引用/弱引用/虚引用/Finallize队列)信息
-Xloggc:D:\log\gc.log 存到文件中

类加载卸载
-verbose:class 类的加载卸载
-XX:+TraceClassLoading 类加载
-XX:+TraceClassUnloading 类卸载
-XX:+PrintClassHistogram 当前类信息柱状图(Ctrl+Break使用)

系统参数查看
-XX:PrintVMOptions 打印虚拟机参数(显式)
-XX:PrintCommandLineFlags 打印全部虚拟机参数
-XX:PrintFlagsFinal 所有的系统参数值

堆配置
-Xms 初始堆大小
-Xmx 最大堆内存
-Xmn 新生代大小(堆的1/4-1/3)
-XX:SurvivorRatio Eden区和s0,s1(from-to)比例(一般8)
-XX:NewRatio 新生代比例(4)
-XX:MaxTenuringThreshold 垃圾最大年龄(15)
-XX:PretenureSizeThreshold 进入老年代的阈值

堆溢出
-XX:HeapDumpOnOutOfMemoryError 内存溢出时生成Dump文件
-XX:HeapDumpPath 指定堆存放路径

方法区配置(Java8为Metaspace元空间)
-XX:PermSize 初始永久代大小
-XX:MaxPermSize 最大永久代

元空间
-XX:MetaspaceSize 元空间大小
-XX:MaxMetaspaceSize 最大元空间(默认无大小)

栈配置
-Xss 线程的最大栈空间

直接内存配置
-XX:MaxDirectMemorySize 最大直接内存(默认最大堆-Xmx)

 

指定GC回收器
-XX:+UseSerialGC 新生代、老年代都使用串行回收器(Clint模式,默认的回收器)
-XX:+UseParNewGC 新生代使用ParNew回收器,老年代使用串行回收器
-XX:+UseParallelGC 新生代使用Parallel回收器,老年代使用串行回收器
-XX:+UseParallelOldGC 新生代使用Parallel回收器,老年代使用ParallelOld回收器
-XX:+UseConcMarkSweepGC 新生代使用ParNew回收器,老年代使用CMS回收器
-XX:ParallelGCThreads 指定ParNew回收器的线程数量
-XX:MaxGCPauseMillis 最大垃圾收集停顿时间
-XX:GCTimeRatio 吞吐量大小(0-100)默认99,即不超过1/(99+1)=1%的时间用于垃圾收集

CMS回收器参数
-XX:ConcGCThreads 设定线程数量
-XX:ParallelCMSThreads 设定线程数量
-XX:CMSInitiatingOccupancyFraction 指定回收阈值,默认68,老年代空间使用率达到68%,执行CMS回收
CMS回收采用标记清除算法,会产生大量内存空间碎片
-XX:UseCMSCompactAtFullCollection 在收集完成后,进行一次内存整理
-XX:CMSFullGCsBeforeCompaction 设定多少次cms回收后,进行内存压缩
-XX:CMSClassUnloadingEnabled 开启回收Class数据

G1回收器
-XX:+UseG1GC 使用G1收集器
-XX:InitiatingHeapOccupancyPercent (默认45)堆使用率达到时,触发并发标记周期执行

 

引用计数
对象引用,计数器+1,引用失效,计数器-1,引用为0,可回收
无法处理循环引用
每次都会计算,性能影响

可达性分析
通过GC Root根节点向下搜索,不可达的对象即为不可用,被认为是可回收的对象
GC Root对象:
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法(Native)中引用的对象

 

标记清除
标记阶段,从根节点标记所有可达对象
清除阶段,清除未被标记的对象
缺点,产生大量不连续的空间

复制算法
将空间分为两块,只使用其中一块,回收时,把存活的对象复制到未被使用的内存块中,清除原内存块中的所有对象
适用于年轻代,survivor区 s0,s1(from-to)
缺点,系统内存折半

标记压缩
在标记清除的基础上,将所有存活对象进行压缩到内存的一端,清理边界外的空间
适用于老年代,等同于标记清除算法完成后,再进行内存碎片整理

分代算法
基于不同回收算法的特性,将内存分为几块,根据对象的特点,使用不同算法,提高效率
分代思想在虚拟机中广泛使用
虚拟机使用卡表(card table)(0,1)记录老年代对象是否持有新生代对象引用,新生代GC时不用扫描所有老年代对象

分区算法
将堆内存分为对个小区间,独立使用、回收,有效减少GC所产生的停顿

覆盖finalize()方法,重新引用对象,可能导致对象复活,谨慎使用

posted on 2019-11-28 17:33  MC伍  阅读(710)  评论(0编辑  收藏  举报