【问题标题】:How to specify a list of JVM parameters for Dockerized SpringBoot REST jar execution如何为 Dockerized SpringBoot REST jar 执行指定 JVM 参数列表
【发布时间】:2020-05-18 23:26:47
【问题描述】:

我有一个使用 SpringBoot 开发的简单 REST 应用程序,并且该应用程序 jar 已部署在 docker 容器中。最终目标是测试此应用程序在不同 JVM 标志值组合下的延迟。我需要知道如何指定一长串可重复更改的 JVM 标志值?

我知道您可以像这样指定一两个标志:
Dockerfile

FROM openjdk:9
ADD target/java-container.jar /usr/src/myapp/
WORKDIR /usr/src/myapp
EXPOSE 8080
CMD java -XX:+PrintFlagsFinal $JAVA_OPTIONS -jar java-container.jar

并运行命令:

$ docker run -d --name mycontainer8g -p 8080:8080 -m 800M -e JAVA_OPTIONS='-Xmx300m' rafabene/java-container:openjdk-env

使用 JAVA_OPTIONS。但是我有一个很长的 JVM 标志列表,如下所示:

-XX:+UseSerialGC -XX:+ResizePLAB -XX:-ResizeOldPLAB -XX:-AlwaysPreTouch -XX:-ParallelRefProcEnabled -XX:+ParallelRefProcBalancingEnabled -XX:+UseTLAB -XX:-ResizeTLAB -XX:-ZeroTLAB -XX:-FastTLABRefill -XX:+NeverActAsServerClassMachine -XX:-AlwaysActAsServerClassMachine -XX:+UseAutoGCSelectPolicy -XX:+UseAdaptiveSizePolicy -XX:+UsePSAdaptiveSurvivorSizePolicy -XX:-UseAdaptiveGenerationSizePolicyAtMinorCollection -XX:+UseAdaptiveGenerationSizePolicyAtMajorCollection -XX:+UseAdaptiveSizePolicyWithSystemGC -XX:+UseAdaptiveGCBoundary -XX:+UseAdaptiveSizePolicyFootprintGoal -XX:-UseAdaptiveSizeDecayMajorGCCost -XX:+UseGCOverheadLimit -XX:+DisableExplicitGC -XX:-CollectGen0First -XX:+BindGCTaskThreadsToCPUs -XX:+UseGCTaskAffinity -XX:YoungPLABSize=3397 -XX:OldPLABSize=1123 -XX:GCTaskTimeStampEntries=240 -XX:TargetPLABWastePct=6 -XX:PLABWeight=75 -XX:OldPLABWeight=46 -XX:MarkStackSize=4617021 -XX:MarkStackSizeMax=713160576 -XX:RefDiscoveryPolicy=0 -XX:InitiatingHeapOccupancyPercent=48 -XX:MaxRAM=139765086242 -XX:ErgoHeapSizeLimit=0 -XX:MaxRAMFraction=4 -XX:DefaultMaxRAMFraction=4 -XX:MinRAMFraction=2 -XX:InitialRAMFraction=61 -XX:AutoGCSelectPauseMillis=5557 -XX:AdaptiveSizeThroughPutPolicy=0 -XX:AdaptiveSizePausePolicy=0 -XX:AdaptiveSizePolicyInitializingSteps=28 -XX:AdaptiveSizePolicyOutputInterval=0 -XX:AdaptiveSizePolicyWeight=12 -XX:AdaptiveTimeWeight=19 -XX:PausePadding=0 -XX:PromotedPadding=3 -XX:SurvivorPadding=3 -XX:ThresholdTolerance=10 -XX:AdaptiveSizePolicyCollectionCostMargin=49 -XX:YoungGenerationSizeIncrement=16 -XX:YoungGenerationSizeSupplement=104 -XX:YoungGenerationSizeSupplementDecay=9 -XX:TenuredGenerationSizeIncrement=22 -XX:TenuredGenerationSizeSupplement=117 -XX:TenuredGenerationSizeSupplementDecay=2 -XX:MaxGCPauseMillis=13557897735059052544 -XX:GCPauseIntervalMillis=0 -XX:MaxGCMinorPauseMillis=16119267456708329472 -XX:GCTimeRatio=73 -XX:AdaptiveSizeDecrementScaleFactor=4 -XX:AdaptiveSizeMajorGCDecayTimeScale=11 -XX:MinSurvivorRatio=1 -XX:InitialSurvivorRatio=6 -XX:BaseFootPrintEstimate=272901592 -XX:GCHeapFreeLimit=2 -XX:PrefetchCopyIntervalInBytes=654 -XX:PrefetchScanIntervalInBytes=748 -XX:PrefetchFieldsAhead=1 -XX:ProcessDistributionStride=3

如何做到这一点?

【问题讨论】:

  • 嗨,你想要这样的东西:将 java_options 写入文件并将其用作 docker 命令的参数?
  • 试试这个,将命令存储在文件中作为 run.sh 并从本地目录挂载这个文件。在本地更新文件并重新启动包含可能会有所帮助。

标签: java spring-boot docker microservices jvm-arguments


【解决方案1】:

正如 A. Wolf 所说,我会将所有 jvm 选项放在一个文件中并运行

docker run --rm -d --name mycontainer8g -p 8080:8080 -m 800M -e JAVA_OPTIONS="$(cat myjavaoptions)" rafabene/java-container:openjdk-env

【讨论】:

    【解决方案2】:

    虽然使用.sh 传递值是有效的,但你有很多参数,所以我认为更清晰的方法是使用docker-compose

    只需从here 安装它,然后您可以在docker-compose.yml 中指定如下内容:

    environment:
      - JAVA_OPTS=-Xmx128m -Xms128m
    

    您将能够更改您的配置,然后只需键入以下内容即可重新启动容器:

    • docker-compose down
    • docker-compose up -d

    【讨论】:

      【解决方案3】:

      您可以使用 --env-file 参数来传递多个环境变量。

      docker run --env-file ./env.list image-name

      这里的 env.list 文件将是您要在 docker 容器中设置的 env 值列表。

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 1970-01-01
        • 2014-09-30
        • 2011-08-18
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多