【问题标题】:Is it possible to store JVM options in a file?是否可以将 JVM 选项存储在文件中?
【发布时间】:2020-03-04 08:27:51
【问题描述】:

我有一个在 AWS Elastic Beanstalk 或我的本地机器上运行的 Tomcat 应用程序。

每当我想启动应用程序时,我都必须向它传递许多-Dkey=value 选项。

这些选项的值取决于我运行的环境(例如,dev、prod、staging 或 qa,...)。

是否可以将这些选项集存储在一个文件中(比如说qa.propertiesdev.propertiesprod.properties,...),以便我可以将-property_file=dev.properties 之类的内容传递给 JVM 以启动开发环境中的java应用?

-property_file=dev.prperties 传递给JVM 比将-Ddev_key1=dev_value1 -Ddev_key2=dev_value2 -Ddev_key3=dev_value3 ... 传递给JVM 更优雅。

我在java -help 中没有找到这样的选项。

Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
where options include:
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available
    -server       to select the "server" VM
                  The default VM is server,
                  because you are running on a server-class machine.


    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose:[class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-search | -no-jre-restrict-search
                  Warning: this feature is deprecated and will be removed
                  in a future release.
                  include/exclude user private JREs in the version search
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details.

【问题讨论】:

  • 您是否考虑将这些选项放入您的 tomcat 文件夹中的 bin/setenv.batbin/setenv.sh 中?更准确地说是在JAVA_OPTS var
  • 这将是一个很好的小脚本。
  • java @file,但它似乎需要 Java 9 或更高版本。在 Linux 下,您可以使用类似 java $(&lt;file) 或您的 shell 提供的任何等效项。
  • 我的 Tomcat 在 AWS Elastic Beanstalk 上运行。这让我不方便在bin/setenv.sh 中设置这些选项。

标签: java tomcat jvm jvm-arguments


【解决方案1】:

在启动tomcat之前执行$CATALINA_HOME/bin/setenv.sh(或%CATALINA_BASE%\bin\setenv.bat对于windows)

你可以写setenv.sh这样的文件

export JAVA_OPTS="$JAVA_OPTS\
 -Ddev_key1=dev_value1\
 -Ddev_key2=dev_value2\
 -Ddev_key3=dev_value3"

【讨论】:

    【解决方案2】:

    是的,当然。 正如 Alexander 提到的,您可以在 tomcat bin 文件夹中添加一个 setenv.sh 文件。 以下是我们正在使用的一些参数。

    # discourage address map swapping by setting Xms and Xmx to the same value
    # http://confluence.atlassian.com/display/DOC/Garbage+Collector+Performance+Issues
    export CATALINA_OPTS="$CATALINA_OPTS -Xms10000m"
    export CATALINA_OPTS="$CATALINA_OPTS -Xmx10000m"
    export CATALINA_OPTS="$CATALINA_OPTS -XX:NewRatio=1"
    
    
    # Increase maximum perm size for web base applications to 4x the default amount
    # http://wiki.apache.org/tomcat/FAQ/Memoryhttp://wiki.apache.org/tomcat/FAQ/Memory
    export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m"
    
    # Reset the default stack size for threads to a lower value (by 1/10th original)
    # By default this can be anywhere between 512k -> 1024k depending on x32 or x64
    # bit Java version.
    # http://www.springsource.com/files/uploads/tomcat/tomcatx-large-scale-deployments.pdf
    # http://www.oracle.com/technetwork/java/hotspotfaq-138619.html
    export CATALINA_OPTS="$CATALINA_OPTS -Xss228k"
    
    # Oracle Java as default, uses the serial garbage collector on the
    # Full Tenured heap. The Young space is collected in parallel, but the
    # Tenured is not. This means that at a time of load if a full collection
    # event occurs, since the event is a 'stop-the-world' serial event then
    # all application threads other than the garbage collector thread are
    # taken off the CPU. This can have severe consequences if requests continue
    # to accrue during these 'outage' periods. (specifically webservices, webapps)
    # [Also enables adaptive sizing automatically]
    export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseParallelGC"
    
    # This is interpreted as a hint to the garbage collector that pause times
    # of <nnn> milliseconds or less are desired. The garbage collector will
    # adjust the  Java heap size and other garbage collection related parameters
    # in an attempt to keep garbage collection pauses shorter than <nnn> milliseconds.
    # http://java.sun.com/docs/hotspot/gc5.0/ergo5.html
    export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxGCPauseMillis=300"
    
    # A hint to the virtual machine that it.s desirable that not more than:
    # 1 / (1 + GCTimeRation) of the application execution time be spent in
    # the garbage collector.
    # http://themindstorms.wordpress.com/2009/01/21/advanced-jvm-tuning-for-low-pause/
    export CATALINA_OPTS="$CATALINA_OPTS -XX:GCTimeRatio=9"
    
    # The hotspot server JVM has specific code-path optimizations
    # which yield an approximate 10% gain over the client version.
    export CATALINA_OPTS="$CATALINA_OPTS -server"
    
    # Disable remote (distributed) garbage collection by Java clients
    # and remove ability for applications to call explicit GC collection
    #Changed the below line - Garbage 
    #export CATALINA_OPTS="$CATALINA_OPTS -XX:+DisableExplicitGC"
    export CATALINA_OPTS="$CATALINA_OPTS -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC  -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log"
    
    

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 2015-01-12
      • 2014-12-25
      • 2022-01-28
      • 1970-01-01
      • 2020-11-06
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多