精华内容
下载资源
问答
  • Java JVM启动参数

    万次阅读 2018-08-22 22:51:46
    已经使用了一段时间的Java,期间也了解和用过一些JVM(Java Virtual Machine)参数,但是没有仔细去整理过每个参数代表的意义,为此整理成文。 Java使用方式 java [options] classname [args] java [options] -jar ...

    Java JVM启动参数

    摘要

    已经使用了一段时间的Java,期间也了解和用过一些JVM(Java Virtual Machine)参数,但是没有仔细去整理过每个参数代表的意义,为此整理成文。

    Java使用方式

    1. java [options] classname [args]
    2. java [options] -jar filename [args]

    options: 命令行选项,空格分隔

    classname: 启动的class名称

    filename: Jar包名称(JAR)

    args: main()方法参数,空格隔开

    加载的class的main()方法必须定义为public static,并且无返回值,参数是字符串列表

    public static void main(String[] args)

    如果使用-jar选项,则args是JAR包包含的class。启动class必须通过Main-Class的manifest指定,示例如下:

    jar {
      manifest {
        attributes 'Main-Class': 'com.xx.xx'
      }
    }

    Options

    Java 命令行提供了以下几种类型的选项

    • 标准选项
    • 非标准选项
    • 高级运行选项
    • 高级JIT编译选项
    • 高级垃圾回收选项
    • 高级可用性选项

    (1) 标准选项被所有类型的JVM支持。标准选项用来做常规操作,如查看版本,设定class path等。

    (2) 非标准选项一般是指Java HotSpot Virtual Machine特定的选项,不能保证被所有类型的JVM支持,该类选项使用时,以-X开头。

    (3) 高级选项是用于Java HotSpot Virtual Machine特定区域调优的选项,同样不能保证被所有的JVM支持。该类选择使用时,以-XX开头。对于Boolean类型的选项,通过使用+表示选项生效,- 来标示选项无效。如-XX:+OptionName表示选项OptionName生效,-XX:-OptionName表示选项OptionName无效。

    标准选项

    所有类型的JVM均支持标准选项, 为此简单列举经常用到的几个选项。

    • -d32

      将应用运行在32bit的环境,如果32bit环境未初始化或不支持,则报错。默认是运行在32bit环境。

    • -d64

      将应用运行在64bit环境。如果64bit环境未初始化或不支持,则报错。默认是运行在32bit环境。

    • -help/-?

      显示帮助文档

    • -verbose:class

      显示每个加载的class

    • -verbose:gc

      显示每次垃圾回收事件

    • -version

      显示当前java 版本

    • -disableassertions[:[packagename]…|:classname] / -da[:[packagename]…|:classname]
      禁用断言(assert),可以指定禁用断言的package和class。

    • -disablesystemassertions / -dsa
      禁用全部断言(assert)

    • -enableassertions[:[packagename]…|:classname] / -ea[:[packagename]…|:classname]

      启用断言,可以指定package和class。默认断言是禁用的。

    • -enablesystemassertions / -esa

      启用全部断言(assert)

    • -server

      选择Java HotSpot Server VM。64bit版本隐含设置-server。

    • -D[property]=value

    定义系统属性值。property变量是一个字符串代表属性名,value代表设定的属性值。

    以设置系统的文件编码为utf-8为例:

    -Dfile.encoding=utf-8

    非标准选项

    非标准选项一般是指Java HotSpot Virtual Machine特定的选项。列举经常用到的几个选项。

    • -X

      显示有效的-X选项的帮助信息

    • -Xbatch

      禁用后台编译。默认情况下JVM是后台编译。该选项等同于 -XX:-BackgroundCompilation

    • -Xloggc:filename

      将GC(garbage collection)信息重定向到filename。当-Xloggc-verbose:gc同时给出时,-Xloggc将重载-verbose:gc

    • -Xmnsize

      设置堆中年轻代(young generation)的初始值和最大值大小。单位是bytes,常用K,M,G (不区分大小写)

      年轻代主要放置新对象,这块区域也是GC执行比较频繁的区域。如果该区域设置较小,可能导致频繁minor GC,如果设置过大,只有Full GC执行则每次GC耗时较长。Oracle建议的大小是整个堆大小的1/4 - 1/2之间。

      以设置大小为256 MB为例:

      -Xmn256m

      不同于-Xmn同时设置初始值和最大值,可通过-XX:NewSize设置初始,-XX:MaxNewSize设置最大值。

    • -Xmssize

      设置堆的初始值,该值必须是1024的倍数并且大于1MB。

      以设置初始值6 MB的堆为例:

      -Xms6m

      如果该值不设置,则通过计算年轻代和老年代的和作为堆的初始值

    • -Xmxsize

      指定应用的最大内存大小,该值必须是1024的倍数并且大于2MB。对于服务型应用,-Xms-Xmx常设置为相同,至于原因涉及垃圾回收机制,如果两者设置相同则应用占据的内存不进行动态扩展。

      以设置最大内存大小1G为例:

      -Xmx1g

      -Xmx等价于高级选项-XX:MaxHeapSize

    • -Xsssize

      设置线程栈的大小。

      以设置大小为1024KB的线程栈为例:

      -Xss1024k

      -Xss等价于高级选项-XX:ThreadStackSize

    高级运行选项

    该类选项控制Java HotSpot VM运行时的情况。列举经常用到的几个选项。

    • -XX:+DisableAttachMechanism

      启用该选项会导致附件在JVM的工具类如jcmd, jstack,jmap jinfo无效。默认情况该选项无效,JVM提供的工具类可使用。

    • -XX:MaxDirectMemorySize=size

      设置最大直接内存大小为size,对于新IO可以使用堆外内存(直接内存)构建对象,该选项是设置这块区域的大小。

      以设置最大直接内存1MB为例:

      -XX:MaxDirectMemorySize=1m

    • -XX:ThreadStackSize

      设置线程栈大小,等价于-Xss选项。

    高级可用性选项

    该类选项提供收集系统信息和debug的能力。列举经常用到的几个选项。

    • -XX:+HeapDumpOnOutOfMemory

      启用该选项,当出现java.lang.OutOfMemoryError异常时,Java的堆信息会dump到当前目录的文件中,文件命名为: java_pid[进程PID].hprof,可以通过-XX:HeapDumpPath指定dump文件路径。通过dump的文件我们利用工具,如MemoryAnalyzer,可以查看系统当时的情况,默认禁用。

    • -XX:HeapDumpPath=path

      指定OutOfMemoryError异常时dump文件的路径,示例如下:

      
      # 指定dump文件路径
      
      -XX:HeapDumpPath=/var/log/java_heapdump.hprof
    • -XX:LogFile=path

      设置log文件,默认情况下在当前目前,命名为hotspot.log。一般我们会利用slf4j工具设置日志,该选项倒不怎么使用。

    高级垃圾回收选项

    该类选项是Java HotSpot VM 用来控制垃圾回收。

    • -XX:+AggressiveHeap

      启用Java堆优化。基于服务器的情况自适应的进行堆优化。默认禁用。

    • -XX:+CMSClassUnloadingEnabled

      启用类卸载当使用CMS(the concurrent mark-sweep)垃圾收集器时。默认启用。如果禁用该选择,设置为-XX:-CMSClassUnloadingEnabled

    • -XX:CMSInitiatingOccupancyFraction=precent

      设置老年代占比当开始CMS垃圾收集时,数值在0-100之间。默认值-1。

      以老年代占比70%为例:

      -XX:CMSInitiatingOccupancyFraction=70
    • -XX:ConcGCThreads=threads

      设置垃圾回收线程的个数在并发GC时。默认值为JVM中有效的CPU的个数。

      以线程个数2为例:

      -XX:ConcGCThreads=2
    • -XX:ParallelGCThreads=threads

      设置垃圾回收线程的个数在并行GC时。默认值为JVM中有效的CPU的个数。

      以线程个数2为例:

      -XX:ParallelGCThreads=2
    • -XX:+DisableExplicitGC

      启用该选项,程序中调用System.gc()的处理均无效。默认禁用该选项,即程序中显示调用System.gc()是执行的。

    • -XX:InitialHeapSize=size

      设置应用内存初始大小,该值为0或为1024的倍数并且大于1 MB

      以设置初始内存大小为6 MB为例:

      -XX:InitialHeapSize=6m
      -XX:InitialHeapSize=6144k
      -XX:InitialHeapSize=6291456

      如果设置为0,则初始值为老年代和新生代的和。

    • -XX:MaxHeapSize=size

      设置应用内存最大值,该值为1024的倍数并且大于2 MB,该值通常与-XX:InitialHeapSize设置相同。

      该选项等价于-Xmx

    • -XX:NewRatio=ratio

      设置年轻代和老年代的比值,默认为2。

      以比值为1为例:

      -XX:NewRatio=1
    • -XX:NewSize=size

      设置堆的年轻代的初始值大小,等价于选项 -Xmn

    • -XX:+PrintGCDetails

      打印每一次GC的详细信息,默认禁用。

    • -XX:+PrintGCDateStamps

      每次GC均显示时间戳,默认禁用

    • -XX:+PrintGCApplicationStoppedTime

      打印GC延迟时长,默认禁用

    • -XX:+UseConCMarkSweepGC

      启用该选项表示在老年代的垃圾回收采用CMS垃圾回收器。启用该选项之后,-XX:+UseParNewGC选项会自动启用,并且不能禁用。默认禁用。在JDK 8中,老年代使用CMS的组合方式,年轻代不使用ParNew,即-XX:-UseParNewGC-XX:+UseConCMarkSweepGC被废弃。

    • -XX:+UseG1GC

      启用G1(garbage-first)垃圾收集器。G1是一种服务器风格的垃圾收集器,针对具有大量RAM的多处理器机器。目标是减少GC延时并且保持吞吐量。建议在设置堆(>= 6 GB)较大时使用。默认禁用。

    • -XX:+UseParallelGC

      启用Parallel Scavenge垃圾收集器,该垃圾收集器是多进程处理,目标是提高吞吐量。该选项启用后,-XX:+UseParallelOldGC会自动启用,除非显示禁用。默认禁用。

    • -XX:+UseParallelOldGC

      启用该选项,在Full GC时使用Parallel Garbage 垃圾收集器。默认禁用。与-XX:+UseParallelGC配对使用。

    • -XX:+UseParNewGC

      启用该选项,在年轻代采用并行线程垃圾回收器。默认禁用。在JDK 8中,年轻代使用ParNew,老年代不使用CMS的组合方式,即-XX:+UseParNewGC-XX:-UseConCMarkSweepGC被废弃。

    • -XX:+UseSerialGC

      启用单线程垃圾回收器。针对简单的小应用,不需要特别垃圾回收设置,该选项是一个交好的选择。默认禁用。

    最后配张年轻代和老年代垃圾回收器的组合图,加深理解。

    这里写图片描述

    图片来自 参考文献[2]

    参考文献

    [1] jdk 1.8 帮助文档

    [2] 深入理解Java虚拟机: JVM高级特性和最佳实践

    展开全文
  • 1.如果服务可以本地启动那么尽量在本地进行参数预估 2.如果服务不能本地启动,可以使用远程连接方式进行预估   3.衡量要点: Java程序运行大致分为三块:堆内存,非堆内存(虚拟机栈,方法区,本地方法栈,程序计数器),...

    1.如果服务可以本地启动那么尽量在本地进行参数预估

    2.如果服务不能本地启动,可以使用远程连接方式进行预估

     

    3.衡量要点:

    Java程序运行大致分为三块:堆内存,非堆内存(虚拟机栈,方法区,本地方法栈,程序计数器),堆外内存.

    docker容器中运行除了Java程序还需要为其余程序余力内存空间.这里假设统一预留50M空间.

    3.1 堆内存的量化

    堆内存主要分为几个区域,新生代,复制区,老年代.考虑GC会大量回收堆内存空间,只要不发生内存逸出和内存

    泄露情况,堆内存能支持一定的并发即可.无线上数据参考情况可以,简单预估QPS为3进行测试堆内存可能大小.

    这里以POIService为例子,启动项目后连接后观察情况如下.

    访问接口调用时,其各项数据.

    图中可以看出 堆内存最小可以到50M最大可大300M左右,堆内存主要用于实例化对象.我们这里预估下 150M就够用了.

    为了线上稳定再次基础上提升10%, 可配置固定内存大小为165M即参数 -Xmx165M -Xms165M

    线程没有及时进行回收,导致线程量一直在增加.需要优化相关代码.不然会导致线程占用内存持续增加,JVM会为每个线程单独

    分配空间.

    3.2 非堆内存量化

    图中可以看出,非堆内存使用量不是很大大概65M左右.

    设置参数:-XX:PermSize=65M -XX:MaxPermSize=130M (1.8以前)

    -XX:MetaspaceSize = 100M (1.8以后)

    这里预估为 165 + 100 + 20(对外内存) + 50 = 335M 这里直接给400M

    这里要说下.因为资源有限才这么设置,如果资源足够可以进行GC时间的衡量来设置相关参数.

    -Xmx180M -Xms180M -XX:MaxDirectMemorySize=20M -XX:MetaspaceSize=100M

    调整后效果还可以,这里主意,GC会导致STW可能影响响应时间,要去衡量那个是当前需要的.

     

    远程调试尝试

    远程连接配置如下:

    [program:configservice]

    command=java -Xmx180M -Xms180M -XX:MaxDirectMemorySize=20M -XX:MetaspaceSize=100M -Djava.rmi.server.hostname=106.75.105.45 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=19999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar -Dfile.encoding=UTF-8 configservice.jar

    没有限制前top观察到内存使用快到1G了,限制后如下:

    一天后再次观察数据如下:

    还是比较稳定的,目前使用内存 350M左右.线上给400M.

     

    展开全文
  • Java8 JVM参数解读

    千次阅读 2018-02-27 18:20:42
    我们知道java虚拟机启动时会有很多的启动参数Java命令本身就是一个多参数启动命令。那么具体JVM启动包含哪些参数呢?这篇文章针对java8的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于小众的就...

    我们知道java虚拟机启动时会带有很多的启动参数,Java命令本身就是一个多参数的启动命令。那么具体JVM启动包含哪些参数呢?这篇文章针对java8的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于小众的就不写了。

    JVM参数官网:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#Options


    1、命令参数包含

    • 标准参数(Standard Option)
    • 非标准参数(Non-Standard Options)
    • 高级运行时参数(Advanced Runtime Options)
    • 高级JIT编译器参数(Advanced JIT Compiler Options)
    • 高级服务能力参数(Advanced Serviceability Options)
    • 高级垃圾回收参数(Advanced Garbage Collection Options)

    java命令本身是通过下面的形式启动java应用的。这是java的基础,很多用惯了IDE的同学可能都不知道启动命令了。

    java [options] classname [args]
    java [options] -jar filename [args]

    这篇文章想总结的就是options这块的内容。


    2、具体解读


    3、标准参数(Standard Option)

    标准参数是被所有JVM实现都要支持的参数。用于做一些常规的通用的动作,比如检查版本、设置classpath等。

    -agentlib:libname[=options]

    这个命令加载指定的native agent库。理论上这条option出现后,JVM会到本地固定路径下LD_LIBRARY_PATH这里加载名字为libxxx.so的库。而这样的库理论上是JVM TI的功能,具体可以参考JVM TI规范

    -agentpath:pathname[=options]

    这个参数指定了从哪个绝对路径加载agent库。与-agentlib相同,只不过是用绝对路径来指明库文件。

    -client
    -server

    指定JVM的启动模式是client模式还是server模式,具体就是 Java HotSpot Client(Server) VM 版本。目前64位的JDK启动,一定是server模式,会忽略这个参数。

    -Dproperty=value

    这个参数是最常见的了,就是设置系统属性,设置后的属性可以在代码中System.getProperty方法获取到。

    -d32 和 -d64

    这个参数指定JVM启动的环境模式,默认是32位启动,如果系统不支持,那么会报错,-d64模式和-server模式是绑定的,也就是说-d64声明了就默认是server模式。

    disableassertions[:[packagename]...|:classname]
    -da[:[packagename]...|:classname]

    关闭指定包或类下的assertion,默认是关闭的。

    -disablesystemassertions
    -dsa

    关闭系统包类下的assertion。

    -enableassertions[:[packagename]...|:classname]
    -ea[:[packagename]...|:classname]

    同上,开启指定包类下的assertion。

    -enablesystemassertions
    -esa

    同上,开启系统包类下的assertion。

    -javaagent:jarpath[=options]

    加载指定的java agent,具体需要传入jar路径。

    -verbose:class
    -verbose:gc
    -verbose:jni

    这些组合都是用来展示信息的,class展示的每个class的信息,gc展示每个GC事件的信息,jni开启展示JNI调用信息。

    -version

    显示版本信息,然后退出


    4、非标准参数(Non-Standard Options)

    这里的非标准参数主要是针对官方JVM也就是HotSpot的,当然各家自研的JVM也有自己的非标准参数。

    -X

    著名的-X参数,就是一个help,展示所有-X开头的参数说明。

    -Xbatch

    禁止后台编译。将编译过程放到前台任务执行。JVM默认会将编译任务当做后台任务执行。这个参数等价于-XX:-BackgroundCompilation

    -Xfuture

    强制class文件格式检查。

    -Xint

    在 interpreted-only模式运行程序。编译为native的模式不再生效,所有的字节码都在解释器环境下解释执行。

    -Xinternalversion

    打印一个更详细的java版本信息,执行后退出。

    -Xloggc:filename

    设置gc日志文件,gc相关信息会重定向到该文件。这个配置如果和-verbose:gc同时出现,会覆盖-verbose:gc参数。

    比如-Xloggc:/home/admin/logs/gc.log

    -Xmaxjitcodesize=size

    为JIT编译的代码设置最大的code cache。默认的设置是240m,如果关闭了tiered compilation,那么默认大小是48m。这个参数和-XX:ReservedCodeCacheSize是等价的。

    -Xmixed

    用解释器执行所有的字节码,除了被编译为native code的hot method。

    -Xmnsize

    设置初始最大的年轻代堆大小。

    比如-Xmn256m

    -Xmssize

    设置初始的堆大小。

    -Xmxsize

    设置最大的内存分配大小。一般的服务端部署,-Xms和-Xmx设置为同样大小。与-XX:MaxHeapSize具有同样的作用。具体设置参考[3]

    -Xnoclassgc

    关闭对class的GC。这样设置可以节约一点GC的时间,不过带来的影响就是class永驻内存,不当的使用会导致OOM风险。

    -XshowSettings:category

    查看settings信息,category可以是all、locale、properties和vm几部分。

    -Xsssize

    设置thread stack大小,一般默认的几个系统参数如下:

    Linux/ARM (32-bit): 320 KB

    Linux/i386 (32-bit): 320 KB

    Linux/x64 (64-bit): 1024 KB

    OS X (64-bit): 1024 KB

    Oracle Solaris/i386 (32-bit): 320 KB

    Oracle Solaris/x64 (64-bit): 1024 KB

    -Xverify:mode

    设置字节码校验器的模式,默认是remote,即只校验那些不是通过bootstrap类加载器加载的字节码。而还有一个模式还all,即全部都校验。虽然还有一个模式是none,但是本质上jvm不生效这个参数。因为字节码校验是非常重要的,如果关闭,将可能导致class文件格式就是错的,这对于系统稳定和安全来说有重大风险。


    5、高级运行时参数(Advanced Runtime Options)

    这类参数控制Java HotSpot VM在运行时的行为。

    -XX:+DisableAttachMechanism

    设置JVM的attach模式,如果启动了这个参数,jvm将不允许attach,这样类似jmap等程序就无法使用了。

    -XX:ErrorFile=filename

    当不可恢复的错误发生时,错误信息记录到哪个文件。默认是在当前目录的一个叫做hs_err_pid pid.log的文件。如果指定的目录没有写权限,这时候文件会创建到/tmp目录下。使用如下:

    -XX:ErrorFile=/var/log/java/java_error.log
    
    -XX:MaxDirectMemorySize=size

    为NIO的direct-buffer分配时指定最大的内存大小。默认是0,意思是JVM自动选择direct-buffer的大小。使用如下:

    -XX:MaxDirectMemorySize=1m
    
    -XX:ObjectAlignmentInBytes=alignment

    java对象的内存对齐大小。默认是8字节,JVM实际计算堆内存上限的方法是

    4GB * ObjectAlignmentInBytes

    -XX:OnError=string

    在jvm出现错误(不可恢复)的时候,执行哪些命令。具体例子如下:

    -XX:OnError="gcore %p;dbx - %p"
    
    -XX:OnOutOfMemoryError=string

    同上,具体错误是OOM。

    -XX:-UseCompressedOops

    禁止使用压缩命令来压缩指针引用。压缩指针是默认开启的,如果使用压缩命令压缩指针,可以在JVM内存小于32G时做到内存压缩,即在64位机器上做到内存指针对齐只占用32位而不是64位。这样对于小于32G的JVM有非常高的性能提升。该参数只在64位JVM有效。

    -XX:+UseLargePages

    使用大页内存[4],默认关闭,使用该参数后开启。


    6、高级JIT编译器参数(Advanced JIT Compiler Options)

    这部分的参数主要在动态just in time编译时用到。

    -XX:+BackgroundCompilation

    后台编译,默认是开启的,如果要关闭,使用-XX:-BackgroundCompilation或者-Xbatch。

    -XX:CICompilerCount=threads

    编译时的编译器线程数。server版的JVM默认设置为2,client版本默认设置为1。如果tiered编译开启,则会伸缩到核数个线程。

    -XX:CodeCacheMinimumFreeSpace=size

    编译使用的最小空闲空间。默认是500KB,如果最小空闲空间不足,则编译会停止。

    -XX:CompileThreshold=invocations

    编译前解释型方法调用次数。设置这个值,在编译前,会用解释器执行方法若干次用于收集信息,从而可以更高效率的进行编译。默认这个值在JIT中是10000次。可以通过使用 -Xcomp参数来禁止编译时的解释执行。

    -XX:+DoEscapeAnalysis

    支持转义分析,默认是开启的。

    -XX:InitialCodeCacheSize=size

    初始化的code cache的大小,默认500KB。这个值应该不小于系统最小内存页的大小。

    -XX:+Inline

    编译时方法内联。默认是开启的。

    -XX:InlineSmallCode=size

    设置最大内联方法的代码长度,默认是1000字节,只有小于这个设置的方法才会被编译内联。

    -XX:+LogCompilation

    编译时日志输出,在编译时会有一个hotspot.log的日志输出到当前工作目录下。可以用-XX:LogFile指定不同的目录。默认这个参数是关闭的,即编译日志不输出。这个参数需要和-XX:UnlockDiagnosticVMOptions一起使用。也可以使用-XX:+PrintCompilation选项在控制台打印编译过程信息。

    -XX:MaxInlineSize=size

    编译内联的方法的最大byte code大小。默认是35,高于35个字节的字节码不会被内联。

    -XX:+OptimizeStringConcat

    字符串concat优化。默认开启。

    -XX:+PrintAssembly

    通过使用外部的disassembler.so库打印汇编的字节码和native方法来辅助分析。默认是不开启的,需要和-XX:UnlockDiagnosticVMOptions一起使用。

    -XX:+PrintCompilation

    将方法编译过程打印到控制台。默认不开启。

    -XX:+PrintInlining

    将内联方法打印出来。默认不开启。

    -XX:ReservedCodeCacheSize=size

    设置为了JIT编译代码的最大代码cache大小。这个设置默认是240MB,如果关掉了tiered编译,则大小是48MB。这个设置必须比初始化的-XX:InitialCodeCacheSize=size设置值大。

    -XX:-TieredCompilation

    关闭tiered编译,默认是开启的。只有Hotspot支持这个参数。

    -XX:+UseCodeCacheFlushing

    支持在关闭编译器之前清除code cache。默认是开启的,要关闭就把+换成-。


    7、高级服务能力参数(Advanced Serviceability Options)

    这部分参数可以做系统信息收集和扩展性的debug。

    -XX:+ExtendedDTraceProbes

    支持dtrace探测,默认是关闭的。

    -XX:+HeapDumpOnOutOfMemory

    设置当java.lang.OutOfMemoryError发生时,将heap内存dump到当前目录的一个文件。默认是不开启的。

    -XX:HeapDumpPath=path

    设置在dump heap时将文件dump到哪里。默认是当前目录下 java_pidpid.hprof这样形式的文件。指定文件时例子如下:

    -XX:HeapDumpPath=/var/log/java/java_heapdump.hprof
    -XX:LogFile=path

    指定日志数据被记录在哪里,默认是在当前目录的hotspot.log下。设置例子如下:

    -XX:LogFile=/var/log/java/hotspot.log
    
    -XX:+PrintClassHistogram

    支持打印类实例的直方图,在按下ctrl+c时(SIGTERM)触发。默认是关闭的。等价于运行jmap -histo命令或者jcmd pid GC.class_histogram命令。

    -XX:+PrintConcurrentLocks

    支持打印java.util.concurrent的锁信息,在SIGTERM时触发。默认关闭,等价于运行jstack -l或者jcmd pid Thread.print -l命令。

    -XX:+UnlockDiagnosticVMOptions

    解锁对JVM进行诊断的选项参数。默认是关闭的,开启后支持一些特定参数对JVM进行诊断。


    8、高级垃圾回收参数(Advanced Garbage Collection Options)

    这部分参数控制JVM如何进行垃圾回收(GC)

    -XX:+AggressiveHeap

    java堆内存优化。默认是关闭的,如果开启后,针对一些长时间运行的且有密集的内存分配操作,JVM根据系统cpu和内存的配置参数来进行优化。

    -XX:+AlwaysPreTouch

    支持在JVM启动时touch每一页,这样做会导致每页都会进入内存。可以用来模拟测试长时间运行的任务,将虚拟内存全部映射到物理内存。默认是关闭的。

    -XX:+CMSClassUnloadingEnabled

    支持CMS垃圾回收下的类卸载。默认是开启的。

    -XX:CMSExpAvgFactor=percent

    设置一个时间百分比,用来加权并发回收统计的指数平均的样本。默认是25%。

    -XX:CMSInitiatingOccupancyFraction=percent

    设置一个年老代的占比,达到多少会触发CMS回收。默认是-1,任何一个负值的设定都表示了用-XX:CMSTriggerRatio来做真实的初始化值。设置方法如下:

    -XX:CMSInitiatingOccupancyFraction=20
    
    -XX:+CMSScavengeBeforeRemark

    开启功能在CMSremark前进行Scavenge。默认是关闭的。

    -XX:CMSTriggerRatio=percent

    设置一个在CMS开始前的内存的触发百分比,针对的是由-XX:MinHeapFreeRatio分配的内存。默认是80。

    -XX:ConcGCThreads=threads

    设置并行标记的线程数。将 n 设置为并行垃圾回收线程数 (-XX:ParallelGCThreads) 的 1/4 左右。

    -XX:ConcGCThreads=2
    
    -XX:+DisableExplicitGC

    关闭显式GC调用,即关闭System.gc()。默认是可以调用的。

    -XX:+ExplicitGCInvokesConcurrent

    支持通过System.gc()来做并发的GC。默认是不支持的。该参数一定要和-

    XX:+UseConcMarkSweepGC一起使用。
    
    -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses

    支持通过System.gc()来做并发的GC并且卸载类。默认是不支持的。该参数一定要和-

    XX:+UseConcMarkSweepGC一起使用。
    
    -XX:G1HeapRegionSize=size

    设置在使用G1收集器时Java堆被划分为子区域的大小。在1MB到32MB之间,默认会根据Java堆的大小自动检测。

    -XX:+G1PrintHeapRegions

    打印出哪些region是被分配的,哪些是被G1取回的。默认是关闭打印的。

    -XX:G1ReservePercent=percent

    设置一个堆内存的百分比用来作为false ceiling,从而降低使用G1时晋升失败的可能性。默认是10%。

    -XX:InitialHeapSize=size

    设置初始堆内存大小,需要设置为0或者1024的倍数,设置为0说明初始堆大小等于年轻代加年老代的大小。

    -XX:InitialSurvivorRatio=ratio

    设置初始的survivor空间占比,当使用throughput型的GC时有效(即-XX:+UseParallelGC 或 -XX:+UseParallelOldGC)。运行过程中survivor空间占比会自动根据应用运行调整,如果关闭了自适应调整策略(-XX:-UseAdaptiveSizePolicy),则XX:SurvivorRatio参数会成为survivor空间占比。计算survivor空间大小,依赖young的空间大小,计算公式如下

    S=Y/(R+2)

    其中Y是young空间大小,R是survivor空间占比。一个例子就是如果young空间大小是2MB,而survivor默认占比是8,那么survivor的空间就是0.2MB。

    -XX:InitiatingHeapOccupancyPercent=percent

    设置一个触发并发GC的堆占用百分比。这个值对于基于整体内存的垃圾回收器有效,比如G1。默认是45%,如果设置为0表示无停顿GC。

    -XX:MaxGCPauseMillis=time

    设置一个最大的GC停顿时间(毫秒),这是个软目标,JVM会尽最大努力去实现它,默认没有最大值设置。

    -XX:MaxHeapSize=size

    设置最大堆大小,这个值需要大于2MB,且是1024的整数倍。等价于-Xmx

    -XX:MaxHeapFreeRatio=percent

    设置在一次GC后最大的堆空闲空间占比。如果空闲堆空间超过这个值,堆空间会被收缩。默认是70%。

    -XX:MaxMetaspaceSize=size

    为类的元数据进行分配的metaspace最大native内存大小,默认情况这个值无限制。该值依赖于当前的JVM、其他在运行的JVM和系统可用内存。

    -XX:MaxNewSize=size

    设置最大的年轻代的堆大小。默认自动检测。

    -XX:MaxTenuringThreshold=threshold

    设置在自适应GC大小的使用占有最大阈值,默认对于parallel(throughput)的是15,对于CMS的是6。

    -XX:MetaspaceSize=size

    设置一个metaspace的大小,第一次超出该分配后会触发GC。默认值依赖于平台,该值会在运行时增加或减少。

    -XX:MinHeapFreeRatio=percent

    设置在一次GC后最小的空闲堆内存占比。如果空闲堆内存小于该值,则堆内存扩展。默认是40%。

    -XX:NewRatio=ratio

    设置年轻代和年老代的比例,默认是2。

    -XX:NewSize=size

    设置初始的年轻代的大小。年轻代是分配新对象的地方,是 GC经常发生的地方。设置太低,会频繁minor GC,设置太高的话就只会发生Full GC了。Oracle推荐设置为整体内存的一半或者1/4。该参数等价于-Xmn。

    -XX:ParallelGCThreads=threads

    并行GC时的线程数。默认值是CPU数。

    -XX:+ParallelRefProcEnabled

    支持并发引用处理,默认是关闭的。

    -XX:+PrintAdaptiveSizePolicy

    打印自适应调整策略。默认关闭。

    -XX:+PrintGC

    打印每次GC的消息,默认是关闭的。

    -XX:+PrintGCApplicationConcurrentTime

    打印上次GC暂停到目前的时间。默认不打印。

    -XX:+PrintGCApplicationStoppedTime

    打印GC暂停的时间长度。默认不打印。

    -XX:+PrintGCDateStamps

    打印每个GC的日期时间戳。默认不打印。

    -XX:+PrintGCDetails

    打印每次GC的细节信息。默认不打印。

    -XX:+PrintGCTaskTimeStamps

    打印每个独立的GC线程任务的时间戳。默认不打印。

    -XX:+PrintGCTimeStamps

    打印每次GC的时间戳。默认不打印。

    -XX:+PrintStringDeduplicationStatistics

    打印细节的deduplication信息。默认不打印。

    -XX:+PrintTenuringDistribution

    打印所在的年龄代的信息。具体例子如下:

    Desired survivor size 48286924 bytes, new threshold 10 (max 10)

    age 1: 28992024 bytes, 28992024 total
    age 2: 1366864 bytes, 30358888 total
    age 3: 1425912 bytes, 31784800 total

    其中age1是最年轻的survivor,age2存活了2代,以此类推。默认该项关闭。

    -XX:+ScavengeBeforeFullGC

    在每次Full GC前做一次年轻代的GC。该项默认是开启的。

    -XX:SoftRefLRUPolicyMSPerMB=time

    设置一个软引用对象在上次被引用后在堆内存中保存的时间。默认是每1MB保存1秒钟。该参数对于client模式和server模式有不同的动作,因为client模式JVM在回收时会强制flush掉软引用,然而server模式会尝试先扩容堆空间。

    -XX:StringDeduplicationAgeThreshold=threshold

    string对象到达特定的age后会去除重复数据。默认是3,jvm中每次gc后存活的对象,age会加一。string对象在晋升为年老代之前都是去除重复数据的候选对象。

    -XX:SurvivorRatio=ratio

    eden区和survivor区的比例。默认是8。

    -XX:TargetSurvivorRatio=percent

    设置在YGC后的期望的survivor空间占比。默认是50%。

    -XX:TLABSize=size

    设置thread-local allocation buffer (TLAB)的初始化大小。

    -XX:+UseAdaptiveSizePolicy

    使用自适应分代大小。默认是开启的。

    -XX:+UseCMSInitiatingOccupancyOnly

    设置使用占用值作为初始化CMS收集器的唯一条件。默认是不开启。

    -XX:+UseConcMarkSweepGC

    设置让CMS也支持老年代的回收。默认是不开启的,如果开启,那么-XX:+UseParNewGC也会自动被设置。Java 8 不支持-XX:+UseConcMarkSweepGC -XX:-UseParNewGC这种组合。

    -XX:+UseG1GC

    设置使用G1作为GC收集器。G1比较推荐在大堆应用场景下使用(大于6GB)。

    -XX:+UseGCOverheadLimit

    设置一种策略用来设置一个时间比率来限制在OOM之前的GC时间。默认是开启的,并行GC时如果有多于98%以上的时间用来gc就会抛出OOM。当堆空间较小时这个参数有助于保护应用程序不至于长时间的停顿没有进展。

    -XX:+UseNUMA

    使用NUMA[5]开启性能优化。默认不开启,该项只有在开启了-XX:+UseParallelGC后才有效。

    -XX:+UseParallelGC

    支持并行的垃圾收集器,即throughput垃圾收集。这可以在多核处理器下提升垃圾收集性能。默认不开启,收集器由系统根据JVM和机器配置自动选择。开启后-XX:+UseParallelOldGC选项也自动开启。

    -XX:+UseParallelOldGC

    支持FULL GC的并行收集器。默认不开启。

    -XX:+UseParNewGC

    支持在年轻代用多线程进行垃圾收集。默认不开启,使用-XX:+UseConcMarkSweepGC时会自动被开启。

    -XX:+UseSerialGC

    支持使用串行收集器。默认不开启。

    -XX:+UseSHM

    在Linux环境下支持JVM使用共享内存来设置大页。

    -XX:+UseStringDeduplication

    支持string的去重存储。默认关闭,要使用该选项,必须使用G1垃圾回收器-XX:+UseG1GC。

    -XX:+UseTLAB

    在年轻代支持thread-local分配block,默认开启。


    原文地址:https://yq.aliyun.com/articles/368436#3

    展开全文
  • java程序启动时怎么设置打印gc log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/work/log/dump -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+...

    java程序启动时怎么设置打印gc log

    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/work/log/dump -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintReferenceGC -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
    

    一些常用的jvm参数设置

     -Xms1024m -Xmx1024m -Xmn256M -XX:MaxDirectMemorySize=128M -XX:MaxPermSize=128M
                -XX:+UseConcMarkSweepGC -Xss512K -XX:+UseParNewGC -XX:+UseCompressedOops -XX:+PrintReferenceGC
                -XX:CMSInitiatingOccupancyFraction=70
    
    展开全文
  • Java虚拟机(JVM)你只要看这一篇就够了!

    万次阅读 多人点赞 2018-08-14 12:55:02
    1.1.1 程序计数器 内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成 如果线程...
  • Gradle 添加 JVM 程序启动参数

    千次阅读 2019-08-11 00:28:07
    1.添加插件 apply plugin: 'application' mainClassName = ... 2.使用 Application 插件设置 JVM 参数 applicationDefaultJvmArgs = [ '-Dapp.home=MY_APP_HOME', ...
  • Java虚拟机(JVM)面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:26:32
    文章目录Java内存区域说一下 JVM 的主要组成部分及其作用?说一下 JVM 运行时数据区深拷贝和浅拷贝说一下堆栈的区别?队列和栈是什么?有什么区别?HotSpot虚拟机对象探秘对象的创建为对象分配内存处理并发安全问题...
  • /opt/taobao/java/bin/java -server -Xms4g -Xmx4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -Xmn2g -XX:MaxDirectMemorySize=1g -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:CMSMaxAbortablePrecl...
  • 要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。 -Xms:初始值 -Xmx:最大值 -Xmn:最小值 解决办法: 修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\...
  • 项目用springboot写的,以往启动都没有设置JVM参数,都是默认的。 今天遇到频繁FGC的情况,导致服务器CPU占用超级高,而且FGC并不能有效的回收对象内存。 1.ps查询对应进程: [root@10-9-166-14 server]# ps aux|...
  • JAVA_JVM参数解释

    千次阅读 2014-07-23 15:25:11
    1.当java程序运行到一定时间的时候。常常抛出java.lang.OutOfMemoryError: Java heap...JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM启动的时候会自动设置Heap size的值,其初始空间(即-Xm
  • javaJVM参数调优

    千次阅读 2019-08-22 22:28:06
    一、首先让Jvm中有一个线程,我们此刻用的一个sleep 二、在terminal中输入jps -l 查看运行程序的端口号为30284 三、查看XX参数是否开启jinfo -flag(jinfo -...五、重新启动程序(端口28852) 六、查看X...
  • 深入理解Javajvm启动流程

    万次阅读 多人点赞 2017-03-24 21:46:25
    概述当我们写一个Java类,并重写Main方法,程序就能运行起来。main方法的背后,程序为什么能运行,jvm究竟做了什么处理?要理解这些,就需要了解jvm的设计原理以及启动的流程。虚拟机的启动入口位于share/tools/...
  • jvm 查看当前java进程的启动参数

    万次阅读 2018-06-25 11:33:22
    为了分析和定位一个Java线上系统问题,我们需要查看JVM启动时的一些参数设置,例如:垃圾回收算法、堆大小等等。这些参数可能在启动脚本中明确指明,也可能采用默认值。在系统运行过程中其他人也许动态调整了系统...
  • Java虚拟机-JVM各种参数配置大全详细

    千次阅读 2017-08-17 11:45:04
    Java虚拟机-JVM各种参数配置大全详细 usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M -Xmn300M -Xss512K -XX:PermSize=300M -XX:MaxPermSize=300M -XX:...
  • java程序启动参数-D详解

    万次阅读 多人点赞 2018-06-26 20:37:04
    java程序启动参数 -D是用来做什么的呢?去查询了一下官方解释: Set a system property value. Ifvalueis a string that contains spaces, you must enclose the string in double quotes: java-Dfoo="somestring...
  • Java:JVM参数设置

    千次阅读 2014-06-01 22:07:30
    1、Eclipse设置JVM参数 在eclipse.ini中: -startup plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120913...
  • 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。
  • IDEA 设置启动 JVM 参数

    千次阅读 2020-07-20 16:55:00
    设置 IDEA 启动参数 如何让 IDEA 运行如飞? 试试先设置下 JVM 运行参数
  • 启动一个java $ java -Xmx1G -jar jenkins.war ...查看启动参数 [yeqiang@localhost ~]$ jcmd 51152 VM.flags 51152: -XX:CICompilerCount=3 -XX:InitialHeapSize=526385152 -XX:MaxHeapSize=107374182
  • JVM启动参数

    千次阅读 2011-12-18 15:45:57
    java [jvmargs] class [arguments] 1.2 标准参数 1.-server -client 虚拟机服务器模式/客户机模式,使用server模式可以提高性能,启动比client模式慢,长期运行则比client模式快。当该参数不指定时,...
  • JVM启动参数详解

    千次阅读 2015-09-24 18:28:17
    JAVA虚拟机(JVM)通过操作系统命令JAVA_HOME\bin\java –option 来启动,-option为虚拟机参数JAVA_HOME为JDK安装路径,通过这些参数可对虚拟机的运行状态进行调整,掌握参数的含义可对虚拟机的运行模式有更深入的...
  • 一、常见的JVM参数配置: 1、垃圾回收统计信息: -XX:+PrintGC打印GC简要信息 -XX:+PrintGCDetails打印GC的详细信息 -XX:+PrintGCTimeStamps打印CG发生的时间戳 -Xloggc:log/gc.log指定GC log的位置,以文件...
  • 线上Java程序JVM频繁FGC,现象如图所示: 一直持续FGC 5次左右,每次耗时1秒多不等。 FGC的原因实际上是内存不够用,但是运维反映堆内存是2G,从运维提供的参数看也是。 内存实际上一直只用到1G以内。 这...
  • Tomcat 启动JVM参数配置

    万次阅读 2016-08-18 18:37:32
    JAVA程序启动JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候,JVM是要先去做垃圾回收的动作,释放被占用的一些内存...
  • idea为java程序添加启动参数(program arguments,vm arguments,Environment variable),并在程序中获取使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 163,657
精华内容 65,462
关键字:

java程序带jvm参数启动

java 订阅