常用参数表
参数 | 描述 |
---|---|
-XX:+PrintGC | 启动java虚拟机后,只要遇到gc,就打印日志 |
-XX:+PrintGCDetails | gc发生时,打印更详细的日志 |
-XX:+PrintHeapAtGC | 每一次GC后,都打印堆信息 |
-XX:+PrintGCTimeStamps | gc发生时,额外打印gc时间,该时间为虚拟机启动到现在的时间偏移量 |
-XX:+PrintGCApplicationStoppedTime | gc时打印应用程序由于gc产生停顿的时间 |
-XX:+PrintReferenceGC | 跟踪系统的软引用,弱引用,虚引用和Finallize队列 |
-Xloggc | 指定gc日志的保存路径。 |
-XX:+TraceClassLoading | 跟踪类加载 |
-XX:+TraceClassUnloading | 跟踪类卸载 |
-XX:+PrintVMOptions | 程序运行时,打印虚拟机接收到的命令行显示参数 |
-XX:+PrintCommandLineFlags | 打印传递给虚拟机的显式和隐式参数 |
-XX:+PrintFlagsFinal | 打印所有系统参数的值 |
-XX:MaxHeapSize | 指定最大内存 |
-XX:SurvivorRatio | 指定新生代中eden区和from/to区的比例关系 |
-XX:NewRatio | 设置老年代/新生代的比例 |
-XX:+HeapDumpOnOutOfMemoryError | 内存溢出时,导出整个堆的信息,和下一个参数配合使用 |
-XX:HeapDumpPath | 导出的堆信息的保存路径,和上一个参数配合使用 |
-XX:OnOutOfMemoryError | 内存溢出发生错误时执行一个脚本文件 |
-XX:PermSize | 配置初始永久区的大小(JDK8中永久区已经被彻底移除,使用了新的元数据区存放类的元数据) |
-XX:MaxPermSize | 配置最大永久区的大小(JDK8中永久区已经被彻底移除,使用了新的元数据区存放类的元数据) |
-XX:MaxMetaspaceSize | 指定元数据区最大可用值 |
-Xss | 指定线程的栈大小 |
-Xms | 指定初始堆空间的大小,例如-Xms20m,默认是物理内存的1/64 |
-Xmx | 指定最大堆空间的大小,例如-Xmx100m,默认是物理内存的1/4 |
-Xmn | 指定新生代的大小,例如-Xmn1m |
-XX:MaxDirectMemorySize | 指定最大可用直接内存值 |
-XX:+PrintCommandLineFlags | 将隐式或者显示传给虚拟机的参数输出 |
-XX:+TraceClassLoading | 监控加载的类信息(启动类加载器) |
-server | 指定虚拟机在server模式下工作 |
-client | 指定虚拟机在client模式下工作 |
-XX:CMSInitiatingOccupancyFraction | 设定CMS在内存占用率达到指定值时开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC),JDK5默认值68,而JDK6时默认值为92 |
-XX:+UseCMSInitiatingOccupancyOnly | 只用设定的回收阈值,若没有指定,JVM仅在第一次使用设定值,后续会自动调整 |
-XX:+CMSScavengeBeforeRemark | 在CMS GC前启动一次ygc,以减少old gen对ygc gen的引用,降低remark的时间(因为CMS GC耗时主要在remark阶段,该参数会使STW停顿时间变长 |
注:JDK8删除了永久区,用元数据区替代。
-
将初始堆与最大堆大小设置相等,可以减少程序运行时的垃圾回收次数,从而提高性能。
-
浅堆:一个对象结构所占用的内存大小
对象大小按照8字节对齐、浅堆大小和对象的内容无关、只和对象的结构有关。 -
深堆:一个对象被GC回收后,可以真实释放的内存大小
只能通过对象访问到的所有对象的浅堆之和(支配树)
注:在命令行输入
- java -verbose:class :输出程序运行时类被加载信息
- java –verbose:gc :输出虚拟机发生内存回收时在输出设备显示信息
- java -verbose:jni :输出native方法调用的相关情况,一般用于诊断jni调用错误信息
例1:
配置参数:
-Xms5m
-Xmx20m
-XX:+PrintGCDetails
-XX:+UseSerialGC
-XX:+PrintCommandLineFlags
public class MemoryInfo {
public static void main(String[] args) {
//查看GC信息
System.out.println("max memory : "+Runtime.getRuntime().maxMemory());
System.out.println("free memory : "+Runtime.getRuntime().freeMemory());
System.out.println("total memory : "+Runtime.getRuntime().totalMemory());
byte[] b1 = new byte[1*1024*1024];
System.out.println("分配1M ");
System.out.println("max memory : "+Runtime.getRuntime().maxMemory());
System.out.println("free memory : "+Runtime.getRuntime().freeMemory());
System.out.println("total memory : "+Runtime.getRuntime().totalMemory());
byte[] b2 = new byte[4*1024*1024];
System.out.println("分配4M ");
System.out.println("max memory : "+Runtime.getRuntime().maxMemory());
System.out.println("free memory : "+Runtime.getRuntime().freeMemory());
System.out.println("total memory : "+Runtime.getRuntime().totalMemory());
//GC日志第三个十六进制数减去第一个十六进制数
int a = 0x00000000fec00000;
int b = 0x00000000ff2a0000;
System.out.println("结果为:"+(b-a)/1024);
}
}
输出结果(加注释):
//PrintCommandLineFlags命令打印的内容
-XX:InitialHeapSize=5242880 -XX:MaxHeapSize=20971520 -XX