美文网首页
Java虚拟机常见参数

Java虚拟机常见参数

作者: cyclone_29 | 来源:发表于2018-06-07 15:19 被阅读0次

    目前的Java虚拟机支持client和server模式,使用参数-client可以指定使用client模式,使用参数-server可以指定使用server
    模式,默认情况下,虚拟机会根据操作系统的环境自动选择运行模式,使用java -version命令可以查看默认的运行模式:

        [root@cdh1 ~]# java -version
        java version "1.8.0_191"
        Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
        Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
    

    可以查出当前的默认运行模式为 Server VM.
    -Xms400m 设置启动时的初始堆为400M,server模式下默认的最小堆为502MB
    -Xmx10m 指定使用的最大堆为10M,server模式下默认的最大堆为8GB.
    JVM初始分配的堆内存由-Xms指定,JVM最大分配的堆内存由-Xmx指定。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。

    堆分为新生代和老年代,新生代分为Eden,from,to三块,from和to是大小相等,可以互换角色的内存空间
    -Xmn10m 设置新生代的大小为10M,如果预先设定了Xmx,最大堆的值是固定的,那么设置一个较大的新生代会减小老年代的大小
    -XX:NewRation=2 设置老年代(tenured generation)和新生代(DefNew)的比例,server模式下默认值为2
    -XX:SurvivorRation=2 设置Eden区域和from区域的比例关系,server模式下默认值为8

    -XX:+DoEscapeAnalysis 启用逃逸分析,只有在server模式下才可以启用,启用过后,可以将线程私有对象分配在栈上,线程执行结束,栈销毁,内存释放,不需要GC的参与。但是线程栈的空间比较小,默认线程栈的大小为1024字节,较大的对象不合适也不能分配到线程栈上。
    -XX:+EliminateAllocations 开启标量替换(默认打开),允许将对象打散分配在栈上

    jdk8删除了perm,使用metaSpace来储存类信息,元数据区使用的是直接内存
    -XX:MaxMetaspaceSize 指定元数据区的大小,如果不指定,默认情况下,虚拟会耗尽所有的系统内存,在指定最大值的情况下,如果内存不足,同样会产生OOM异常。

    -XX:+PrintGC 只要遇到GC,就会打印日志。
    -XX:+PrintGCApplicationStoppedTime GC会引起应用程序的停顿,这个参数可以打印程序因为GC而产生的停顿时间
    -XX:+PrintGCDateStamps 打印GC的详细情况,同时打印GC的时间,date格式
    --verbose:class 跟踪类的加载和卸载信息
    -XX:+PrintVMOptions 在程序运行时,打印虚拟机接受到的命令行显示参数
    -XX:+PrintCommandLineFlags 打印传递给虚拟机的显示和隐式参数,参数未必是通过命令行直接给出的,也可能是虚拟机启动时自行设置的。

    -Xss10k 指定线程栈的大小,线程栈的大小影响函数的调用深度
    -XX:MaxDirectMemorySize 直接内存,默认为最大堆大小

    当jvm启动之后,了分析和定位一个Java线上系统问题,我们需要查看JVM启动时的一些参数设置,例如:垃圾回收算法、堆大小等等。这些参数可能在启动脚本中明确指明,也可能采用默认值。在系统运行过程中其他人也许动态调整了系统参数。 如何实时查看正在运行的JVM的参数呢?
    可以使用jps命令查看进程的pid
    使用jinfo -flags pid查看jvm的启动参数

    相关文章

      网友评论

          本文标题:Java虚拟机常见参数

          本文链接:https://www.haomeiwen.com/subject/vjygsftx.html