【JVM】常用虚拟机参数及实例

本文介绍了JVM的常用参数及其作用,包括堆内存设置、垃圾收集器选择、内存回收详细信息的打印等。通过多个实例展示了不同参数配置下的运行结果,如-Xms、-Xmx、-XX:+PrintGCDetails等,并给出了适用于长连接服务端应用的推荐JVM参数设置。
摘要由CSDN通过智能技术生成

常用参数表

参数 描述
-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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值