#!/bin/bash VERBOSE=false while getopts "v" arg; do case $arg in v ) VERBOSE=true ;; * ) ;; esac done # Сдвигаем позиционные параметры после обработки опций shift $((OPTIND-1)) JAR_FILE_NAME=$1 if [ -f /sys/fs/cgroup/memory/memory.limit_in_bytes ] then LIMITED_RAM_CONTAINER_CGROUP_SIZE_BYTES=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes) if [ $VERBOSE = true ]; then echo "Cgroups v1 are used"; fi elif [ -f /sys/fs/cgroup/memory.max ] then LIMITED_RAM_CONTAINER_CGROUP_SIZE_BYTES=$(cat /sys/fs/cgroup/memory.max) if [ $VERBOSE = true ]; then echo "Cgroups v2 are used"; fi else echo "No cgroups files with memory limits"; exit 1 fi # LIMITED_RAM_CONTAINER_CGROUP_SIZE_MB=$((LIMITED_RAM_CONTAINER_CGROUP_SIZE_BYTES / 1024 / 1024)) TOMCAT_THREADS_MAX=${TOMCAT_THREADS_MAX:-100} TOMCAT_THREADS_MIN=${TOMCAT_THREADS_MIN-$TOMCAT_THREADS_MAX} HIKARI_DB_MAXIMUM_POOL_SIZE=${HIKARI_DB_MAXIMUM_POOL_SIZE:-10} HIKARI_DB_MINIMUM_IDLE_SIZE=${HIKARI_DB_MINIMUM_IDLE_SIZE:-$HIKARI_DB_MAXIMUM_POOL_SIZE} JVM_NATIVE_MB=${JVM_NATIVE_MB:-120} STOCK_SIZE_MB=$((TOMCAT_THREADS_MAX / 2 + HIKARI_DB_MAXIMUM_POOL_SIZE + JVM_NATIVE_MB)) LIMITED_MAXRAM_JAVA_SIZE_MB=$((LIMITED_RAM_CONTAINER_CGROUP_SIZE_MB - STOCK_SIZE_MB)) # RESERVED_CODE_CACHE_SIZE_MB=${RESERVED_CODE_CACHE_SIZE_MB:-64} MAX_METASPACE_SIZE_MB=${MAX_METASPACE_SIZE_MB:-80} DIRECT_BYTES_BUFFERS_MB=${DIRECT_BYTES_BUFFERS_MB:-10} COMPRESSED_CLASS_SPACE_MB=${COMPRESSED_CLASS_SPACE_MB:-16} NON_HEAP_SIZE_MB=$((RESERVED_CODE_CACHE_SIZE_MB + MAX_METASPACE_SIZE_MB + DIRECT_BYTES_BUFFERS_MB + COMPRESSED_CLASS_SPACE_MB)) # HEAP_GC_SIZE_MB=$((LIMITED_MAXRAM_JAVA_SIZE_MB - NON_HEAP_SIZE_MB)) OVERHEAD_GC_SIZE_PERCENT=${OVERHEAD_GC_SIZE_PERCENT:-5} OVERHEAD_GC_SIZE_MB=$((HEAP_GC_SIZE_MB * OVERHEAD_GC_SIZE_PERCENT / 100)) HEAP_SIZE_MB=$((HEAP_GC_SIZE_MB - OVERHEAD_GC_SIZE_MB)) # MAX_RAM_PERCENTAGE=$((HEAP_SIZE_MB * 100 / LIMITED_MAXRAM_JAVA_SIZE_MB)) # export calculated environments export TOMCAT_THREADS_MAX=$TOMCAT_THREADS_MAX export TOMCAT_THREADS_MIN=$TOMCAT_THREADS_MIN export HIKARI_DB_MAXIMUM_POOL_SIZE=$HIKARI_DB_MAXIMUM_POOL_SIZE export HIKARI_DB_MINIMUM_IDLE_SIZE=$HIKARI_DB_MINIMUM_IDLE_SIZE if [ $VERBOSE = true ] then echo "LIMITED_MAXRAM_JAVA_SIZE_MB=$LIMITED_MAXRAM_JAVA_SIZE_MB" echo "HEAP_SIZE_MB=$HEAP_SIZE_MB" echo "MAX_RAM_PERCENTAGE=$MAX_RAM_PERCENTAGE" fi # shellcheck disable=SC2086 exec java \ -XX:+UseContainerSupport \ -XX:+ExitOnOutOfMemoryError \ -XX:MaxRAM="${LIMITED_MAXRAM_JAVA_SIZE_MB}m" \ -XX:MaxRAMPercentage="$MAX_RAM_PERCENTAGE" \ -XX:+SegmentedCodeCache \ -XX:ReservedCodeCacheSize="${RESERVED_CODE_CACHE_SIZE_MB}m" \ -XX:MaxMetaspaceSize="${MAX_METASPACE_SIZE_MB}m" \ $JAVA_OPTS_OVERRIDE \ -jar /app/"$JAR_FILE_NAME"