joe

Java -jar 启动程序参数说明

Springboot环境下的启动参数说明

# Java启动命令语法:
java [options] -jar file.jar [arguments]
java -jar [options] file.jar [arguments]
javaw [options] -jar file.jar [arguments] #javaw不会启动一个控制台窗口(启动失败的时候会弹出附有错误信息的窗口)
# 可选项(options)
# 程序参数(arguments)
# -jar 指定以 jar 包的形式执行一个应用程序

# 1、标准可选项(Standard options)
java -Dserver.port=8081 -jar app.jar     #(系统参数)-Dxxx是java运行参数的语法,作用是配置一些环境变量

# -D 是java用来设置全局参数的,可覆盖yaml文件中的变量,但无法覆盖远程Nacos变量值
# --key=value 可覆盖Nacos,优先级最高

-Dspring.profiles.active
-Dspring.config.location                 # 指定打包后配置文件的路径
-Dfile.encoding=utf=8                    # 设置字符集
-Djava.security.egd=file:/dev/./urandom  # 可以一定程度上加快应用启动
-Dspring.config.additional-location=./application-dev.yml      # 加载服务器配置文件

# 2、非标准可选项(Nonstandard Options)
java -Xms512m -Xmx1024m -jar app.jar

-Xms512m             # JVM初始堆内存
-Xmx1024m            # JVM最大堆内存
-XX:PermSize=256m       # JVM初始非堆内存
-XX:MaxPermSize=512m      # JVM最大非堆内存

# 3、程序参数(arguments)
java -jar app.jar a b c                # (非选项参数)a,b,c参数就是jar包里主启动类中main方法的args参数,按顺序来
java -jar app.jar --server.port=8081   # (选项参数)其作用等价于在application.properties中的server.port=8081

--server.port=8081
--spring.profiles.active=dev
--spring.cloud.bootstrap.name=bootstrap-dev
--spring.cloud.nacos.config.server-addr=127.0.0.3:8848

后台运行jar包且指定输出文件

# nohup 不挂断地运行命令;& 在后台运行,一般两个一起用:nohup command &
nohup java -jar app.jar >outlog.log 2>&1 &

>outlog.log    # 覆盖原有内容
>>outlog.log   # 将输出结果追加到文件末尾

# 在Linux系统中0 1 2是一个文件描述符:
标准输入(stdin)  0  # 0表示键盘输入
标准输出(stdout) 1  # 1表示屏幕输出
错误输出(stderr) 2  # 2表示错误输出

程序参数(选项/非选项参数)

可以通过ApplicationArguments接口获取,选项参数也可以通过@Value在类中获取。

具体获取方法直接在使用参数的类中注入该接口即可

@RestController
public class ArgumentsController {
  @Resource
  private ApplicationArguments arguments;

  @GetMapping("/args")
  public void getArgs() {
      System.out.println("# 非选项参数数量: " + arguments.getNonOptionArgs().size());
      System.out.println("# 选项参数数量: " + arguments.getOptionNames().size());
      System.out.println("# 非选项具体参数:");
      arguments.getNonOptionArgs().forEach(System.out::println);

      System.out.println("# 选项参数具体参数:");
      arguments.getOptionNames().forEach(optionName -> {
          System.out.println("--" + optionName + "=" + arguments.getOptionValues(optionName));
      });
  }
}

可选项(系统参数)

(-Dproperty=value)可以通过@Value或java.lang.System提供的方法获取

@RestController
public class ParamController {

  @Value("${property}")
  private String serverPort;

  public void test(){
     String systemServerPort = System.getProperty("property"); // -Dproperty
  }
}

配置文件的优先级

当外部定义了/config/bootstrap.yml

在部署Java项目时,指定外部的/config/bootstrap.yml 文件,那么这个外部文件中的配置会优先于内置的 resources/bootstrap.yml文件中的配置被加载和应用。也就是说,如果两者中有任何冲突的配置,外部文件中的配置将会覆盖内置文件中的配置。


Springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件。

java -jar myproject.jar --spring.config.location=classpath:/default.yml,classpath:/override.yml

–file:./config/
–file:./
–classpath:/config/
–classpath:/

优先级由高到低,高优先级的配置会覆盖低优先级的配置。


如果想指定自定义目录的配置文件,则可以使用以下方式:

java -jar myproject.jar --spring.config.location=d://data/application.yml
java -jar myproject.jar --spring.config.location=http://example.com/config.yml

# Spring Boot会按照指定的顺序加载配置文件。因此,在覆盖配置时,请确保覆盖的配置文件在指定的位置之后加载。

获取系统参数的方法

java提供了System类的静态方法getenv()和getProperty()用于返回系统相关的变量与属性。

  • getProperty() 方法返回的变量大多与java程序有关。

  • System.getenv() 方法是获取指定的环境变量的值。

  • System.getenv(String name) 接收参数为任意字符串,当存在指定环境变量时即返回环境变量的值,否则返回null。

  • System.getProperty() 是获取系统的相关属性,包括文件编码、操作系统名称、区域、用户名等,此属性一般由jvm自动获取,不能设置。

  • System.getProperty(String key) 接收参数为任意字符串,当存在指定属性时即返回属性的值,否则返回null。


Spring Boot堆参数设置

-XX:+PrintGC
    使用这个参数,虚拟机启动后,只要遇到GC就会打印日志

-XX:+PrintGCDetails
    可以查看详细信息,包括各个区的情况

-XX:+PrintHeapAtGC
    打印 GC 前后的详细堆栈信息

-Xms3550m(默认物理内存的64分之一)
    设置Java程序启动时初始化JVM堆内存大小

-Xmx3550m(默认物理内存的4分之一)
    设置Java程序能获得最大JVM堆内存大小

在实际工作中,我们可以直接将初始的堆大小与最大堆大小设置相等,这样的好处是可以减少程序运行时的垃圾回收次数,从而提高性能。

-XX:+PrintFlagsInitial
    打印JVM初始化参数。

-XX:+PrintFlagsFinal
    标记人为修改过的参数。

-XX:+PrintCommandLineFlags
    查看默认垃圾回收器。

新生代参数配置

-XX:NewSize=5m
    设置新生代最小空间大小

-XX:MaxNewSize=10m
    设置新生代最大空间大小

-Xmn2g
    可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,新生代大小一般会设置整个堆空间的1/3。

-XX:SurvivorRatio=8(默认)
    用来设置新生代中eden空间和from/to空间的比例。含义:-XX:SurvivorRatio=eden/from=eden/to。
    基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。

-XX:NewRatio=2(默认)
    设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。

对象进入老年代的参数配置

-XX:MaxTenuringThreshold=15
    新生代每次GC之后如果对象没有被回收,则年龄加1,默认情况下为15

堆溢出参数配置

-XX:+HeapDumpOnOutOfMemoryError
    使用该参数可以在内存溢出时导出整个堆信息

-XX:HeapDumpPath=D:/OOM.dump
    可以设置导出堆的存放路径。

垃圾回收器

串行垃圾回收器(单个垃圾回收线程,所有其他工作线程暂停:STW):

    -XX:+UseSerialGC(年轻代复制算法,年老代标记-整理算法)
        配置串行回收器,开启后新,老都是串行垃圾回收。

串行收集器特别适合堆内存不高、单核甚至双核CPU的场合。


并行垃圾回收器(多个垃圾回收线程,所有其他工作线程暂停:STW):

    -XX:+UseParallelGC(复制算法)(与下面配置选择其中一个即可,可以互相激活)
    -XX:+UseParallelOldGC(标记-整理算法)
        配置年轻代,年老代垃圾收集方式为并行收集。 JDK6.0 支持对年老代并行收集。

    -XX:ParallelGCThreads=4
        配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

    -XX:+UseAdaptiveSizePolicy
        设置此选项后,并行收集器会自动选择年轻代区大小和相应的 Survivor 区比例,
        以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

    -XX:MaxGCPauseMillis=100
        设置每次并发收集最大停顿时间。设定此值可能会减少应用的吞吐量。
        ParallelGC 工作时,会调整 Java 堆大小或者其他的一些参数,尽可能的把停顿时间控制在 MaxGCPauseMillis 以内。

并行收集器适合对吞吐量要求远远高于延迟要求的场合。
(吞吐量:应用程序线程用时占程序总用时的比例,暂停时间:一个时间段内应用程序线程让与GC线程执行而完全暂停)

并发垃圾回收器(并发-标记-清除算法)(多个垃圾回收线程,用户线程不暂停:CMS)(只针对年老代):

    -XX:+UseParNewGC(复制算法)(自动激活UseConcMarkSweepGC年老代并发垃圾回收器)(STW)
        选择新生代垃圾收集器为并行收集器。

    -XX:+UseConcMarkSweepGC(标记-清除算法)(自动激活UseParNewGC年轻代并发垃圾回收器)(CMS)
        设置年老代为并发收集。
        此回收器出错后,备用是Serial Old串行回收器,如果在回收完成之前堆内存耗尽,CMS回收失败。

    -XX:+UseCMSCompactAtFullCollection
        打开对年老代的压缩。可能会影响性能,但是可以消除碎片。参数指定每次 CMS 后进行一次碎片整理。

    -XX:CMSFullGCsBeforeCompaction=5
        由于并发收集器不对内存空间进行压缩、整理,
        所以运行一段时间以后会产生“碎片”,使得运行效率降低。
        此值设置运行多少次 GC 以后对内存空间进行压缩、整理。

    -XX:ParallelGCThreads=4
        指定 GC 工作线程数量。

    -XX:ParallelCMSThreads=4
        设定 CMS 并发线程数。

CMS并发收集、低停顿。非常适合堆内存大、CPU核数多的服务器端应用。
注重服务的响应速度,希望系统停顿时间最短,给用户带来更好的体验等场景下。如web程序、b/s服务。

G1垃圾回收器(年轻代垃圾回收会暂停所有其他线程:STW):

    年轻代的垃圾收集, 会发生stop the world。 在回收时所有的应用程序线程都会被暂停。通过多线程并行进行。

    收集器可以工作在young 区,也可以工作在 old 区。

    -XX:UseG1GC(并行+并发)(不会产生碎片)
        存储不需要物理上连续,只需要逻辑上连续。

    -XX:G1HeapRegionSize=n
        指定分区大小(1mb-32mb,必须是2的幂),默认2048个分区。

    -XX:MaxGCPauseMillis=100(单位毫秒)
        设置每次并发收集最大停顿时间。设定此值可能会减少应用的吞吐量。
        如果任何一次停顿超过这个设置值时,G1 就会尝试调整新生代和老年代的比例,调整堆大小,调整晋升年龄的手段,试图达到目标。

    -XX:GCPauseIntervalMillis=n
        设置停顿时间间隔。

    -XX:ParallelGCThreads=4
        由于是并行并发的,可以指定 GC 工作线程数量。

G1的收集,年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。
即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集)

G1的应用场合往往堆内存都比较大,所以Full GC(可用内存不足时触发)的收集代价非常昂贵,应该避免Full GC的发生。
G1能够独自管理整个Java堆,并行与并发,不会产生空间碎片,低停顿,可预测的停顿。

栈参数配置

-Xss1m(默认)
    来指定线程的最大栈空间

方法区参数配置

JDK1.2 ~ JDK6,使用永久代来实现方法区

-XX:PermSize=64M
    设置永久代最小空间大小。

-XX:MaxPermSize=64M(默认)
    如果系统运行时生产大量的类,就需要设置一个相对合适的方法区,以免出现永久区内存溢出的问题。


Java8,元空间取代永久代

    存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的
    而元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。

    存储内容不同,元空间存储类的元信息
    静态变量和常量池等并入堆中。
    相当于永久代的数据被分到了堆和元空间中。

-XX:MetaspaceSize=128m(默认)
    初始化大小。
 
-XX:MaxMetaspaceSize=128m
    JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。

TLAB参数配置

Thread Local Allocation Buffer即线程本地分配缓存:
    一个线程专用的内存分配区域,是为了加速对象分配对象而生的。

每一个线程都会产生一个TLAB,该线程独享的工作区域,Java虚拟机使用这种TLAB区来避免多线程冲突问题,提高了对象分配的效率。


-XX:+UseTLAB(默认开启)
    使用TLAB

-XX:TLABSize=64k(默认)
    设置TLAB初始化大小

-XX:TLABRefillWasteFraction=64
    设置维护进入TLAB空间的单个对象大小,它是一个比例值,默认为64,即如果对象大于整个空间的1/64,则在堆创建对象。

-XX:+ResizeTLAB
    自调整TLABRefillWasteFraction阈值。

-XX:+PrintTLAB
    查看TLAB信息

码字很辛苦,转载请注明来自朱一兵的博客《Java -jar 启动程序参数说明》

评论