jvm-参数信息

jvm各个参数介绍

  • -Xms,堆内存初始值,示例:java -Xms20m GCDemo,设置堆内存初始值20m。

  • -Xmx,堆内存最大值,示例:java -Xms20m -Xmx30m GCDemo,设置堆内存初始值20m最大值30m。

  • -Xmn,年轻代大小,示例:java -Xms20m -Xmn10M GCDemo,设置堆内存初始值20m年轻代10m。

  • 老年代大小,示例:堆内存初始大小 - 年轻代大小

  • 内存区域的分配信息打印,示例:java -Xms20m -Xmn10M -XX:+PrintGCDetails,设置堆内存初始值为20m年轻代10m并打印信息。
    堆内存信息打印

  • -XX:SurvivorRatio,eden from to比例,示例:java -Xms20m -Xmn10M -XX:SurvivorRatio=2 -XX:+PrintGCDetails GCDemo,设置堆内存初始值为20m年轻代10m,eden/from = eden/to = 2。

      例如我们的年轻代有 10 M,而我们设置 -XX:SurvivorRatio 参数为 2。也就是说 eden / from = eden / to = 2。这里教一个快速计算的方法,我们假设 eden = 2,那么 from = 1,to = 1,那么 eden + from + to = 10M。这样就可以算出每一份大小是 10/4 = 2.5M。所以 Eden 区 = 2.5 * 2 = 5M,from 区是 2.5 M,to 区是 2.5 M。
      我们设置堆初始大小为 20M,年轻代大小为 10M,年轻代的 SurvivorRatio 比例为 2。那么最终分配的结果将会是:年轻代 10M,其中 Eden 区 5M、From 区 2.5M、To 区 2.5 M,老年代 10M。
      还有一个细节,即 PSYoungGen 这里的 total 只有 7680K,难道年轻代只有 7.5M 的内存吗?为什么不是 10M 呢?其实是因为这里的 total 指的是可用内存,from space 和 to space 两个区域,同一时间只有一个区域是可以用的。所以可用内存是 5120 + 2560 = 7680。
    eden from to比例设置

  • -XX:MetaspaceSize,元空间GC阈值(JDK1.8)。

  • -XX:MaxMetaspaceSize,最大元空间大小(JDK1.8)。

      示例:java -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=50m -XX:+PrintGCDetails GCDemo。
      上面的命令中,我们设置 MetaspaceSize 为 10M,MaxMetaspaceSize 为 50M。但其实它们并不是设置初始大小和最大大小的。
      从上面的执行结果可以看到,Metaspace 空间的大小为 2.6M 左右,并不是我们设置的 10M。那是因为 MetaspaceSize 设置的是元空间发生 GC 的初始阈值。当达到这个值时,元空间发生 GC 操作,这个值默认是 20.8M。而 MaxMetaspaceSize 则是设置元空间的最大大小,默认基本是机器的物理内存大小。虽然可以不设置,但还是建议设置一下,因为如果一直不断膨胀,那么 JVM 进程可能会被 OS kill 掉。

  • -Xss,栈空间,示例:java -Xss2m GCDemo,设置最大栈空间为 2M。

      栈空间是每个线程各自有的一块区域,如果栈空间太小,也会导致 StackOverFlow 异常。而要设置栈空间大小,只需要使用 -Xss 参数就可以。

  • -XX:MaxDirectMemorySize,直接内存,示例:java -XX:MaxDirectMemorySize=50m GCDemo,直接内存最大值为 50M。

      如果不设置,默认为最大堆空间,即 -Xmx。当直接内存使用达到设置值时,就会触发垃圾回收。如果不能有效释放足够空间,就会引发直接内存溢出导致系统的 OOM。

  • -XX:+UseG1GC,启用G1垃圾回收器(Garbage-First Garbage Collector),G1垃圾回收器是Java 7及以后版本中引入的新一代垃圾回收器。

  • -XX:-OmitStackTraceInFastThrow,禁用在快速抛出异常时省略堆栈轨迹(stack trace)的优化。

  • -XX:+HeapDumpOnOutOfMemoryError,用于在出现内存溢出错误(OutOfMemoryError)时生成堆内存转储文件(heap dump)。

  • -XX:HeapDumpPath=/logs/gc/java_heapdump.hprof,用于指定堆内存转储文件(Heap Dump)的输出路径。

      当使用-XX:+HeapDumpOnOutOfMemoryError选项时,当JVM抛出OutOfMemoryError异常时会生成堆内存转储文件。而-XX:HeapDumpPath选项用于指定生成的堆内存转储文件的输出路径。

  • -Xloggc:/logs/gc/service_gc_%t.log,用于指定垃圾收集日志(GC log)文件的输出路径。

  • -verbose:gc,用于打印详细的垃圾收集(GC)日志信息,JVM会在控制台输出垃圾收集的详细信息,包括每次垃圾收集发生的时机、耗时、GC类型(如新生代GC和老年代GC等)、内存使用情况、堆的大小等。

      一般用于开发和测试环境,因为会打印大量的日志信息,影响性能。

  • -XX:+PrintGCDetails,用于打印垃圾收集(GC)的详细信息,VM会在控制台输出更详细的垃圾收集日志信息,包括每次垃圾收集的时机、耗时、GC类型(如新生代GC和老年代GC等)、内存使用情况、堆的大小、对象分配速率等。

      一般用于开发和测试环境,因为会打印大量的日志信息,影响性能。

  • -XX:+PrintGCDateStamps,用于在打印垃圾收集(GC)相关信息时,同时输出时间戳,JVM会在控制台输出垃圾收集日志信息,并在每条日志前添加具体的时间戳信息,这些时间戳信息通常以日期和时间的形式显示,可以帮助我们更好地分析和理解垃圾收集的时间顺序和间隔,示例:java -XX:+PrintGCDateStamps -jar YourApplication.jar

      一般用于开发和测试环境,因为会打印大量的日志信息,影响性能。

  • -XX:+PrintGCTimeStamps,用于在打印垃圾收集(GC)相关信息时,同时输出时间戳。

      一般用于开发和测试环境,因为会打印大量的日志信息,影响性能。

  • -XX:+UseGCLogFileRotation,用于启用垃圾收集(GC)日志文件的轮转功能。

      将垃圾收集日志输出到一个特定的日志文件中,并在日志文件大小达到一定阈值时,自动进行轮转操作。轮转操作包括将当前日志文件重命名为备份文件,并重新创建一个新的日志文件,通过启用垃圾收集日志文件的轮转功能,可以避免单个日志文件过大,方便管理和分析垃圾收集日志,要同时配置相关的选项来确定日志文件的位置、命名规则以及轮转的阈值,例如:-XX:GCLogFileSize=10M -XX:NumberOfGCLogFiles=5 -Xloggc:/path/to/gc.log,上述配置中,-XX:GCLogFileSize=10M 表示日志文件大小达到10M时进行轮转,-XX:NumberOfGCLogFiles=5 表示最多保留5个备份日志文件,-Xloggc:/path/to/gc.log 表示将日志输出到指定路径的gc.log文件,一般用于开发和测试环境的调试和性能分析,在生产环境中,可以使用更专业的垃圾收集日志工具(如GC日志分析工具、可视化工具等)来收集和分析垃圾收集信息。

  • -javaagent:/opt/skywalking/agent/skywalking-agent.jar,用于在JVM启动时加载并执行一个Java代理(Java Agent)。

      Java代理是一种Java应用程序,可以通过Java代理API来监控、修改和增强在JVM中正在运行的其他Java应用程序的行为。它可以在应用程序的类加载、字节码增强、方法拦截等级别上进行操作,以实现各种功能,如性能监控、方法耗时统计、AOP(面向切面编程)支持、内存分析等。
    代理JAR文件需要包含一个特定的Agent-Class类,该类实现了 public static void premain(String agentArgs, Instrumentation inst) 方法。JVM会在加载主类之前调用该方法,用于初始化和配置代理,并将 Instrumentation 对象传递给代理,使其能够操作正在运行的应用程序的字节码。另外,可以使用 -javaagent 选项的参数部分来传递代理所需的任何参数。例如:java -javaagent:/path/to/agent.jar=arg1=value1,arg2=value2 -jar YourApplication.jar,上述命令会将 arg1=value1,arg2=value2 作为参数传递给代理JAR文件中的 premain 方法。需要注意的是,使用 -javaagent 选项加载代理可能会对应用程序的性能产生一定的影响。因此,在生产环境中使用代理时,应谨慎选择并评估代理的性能影响。

  • -Dskywalking.agent.service_name=my-service,用于配置SkyWalking代理的服务名称。

  • -Dskywalking.agent.sample_n_per_3_secs=1,用于配置SkyWalking代理在每3秒钟内采样的次数。

  • -Dskywalking.collector.backend_service=skywalking-oap:11800,用于配置SkyWalking代理连接的SkyWalking后端服务的地址。

  • -Dspring.profiles.active=${ACTIVE_PROFILE},用于配置Spring Boot应用程序的活动配置文件。

Dockerfile简单使用示例

FROM xxxxx/java:1.8

MAINTAINER EdwinYang <edwin.yang@qq.com>

ADD target/*.jar /app.jar

RUN chmod 777 /app.jar

VOLUME /temp

ENV JAVA_OPTS='-server -Xms1024m -Xmx1024m'
#ENV ACTIVE_PROFILE='dev'
RUN mkdir -p /logs/gc
#启动容器时的进程(指定profile)
#ENTRYPOINT ["java","-jar","/app.jar"]
#ENTRYPOINT ["java","-Dspring.profiles.active=dev","-jar","/app.jar"]
#ENTRYPOINT java ${JAVA_OPTS} -Dspring.profiles.active=${ACTIVE_PROFILE} -jar /app.jar
ENTRYPOINT java -server -Xms${MAX_MEM} -Xmx${MAX_MEM} \
      -XX:+UseG1GC \
      -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m \
      -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError \
      -XX:HeapDumpPath=/logs/gc/java_heapdump.hprof \
      -Xloggc:/logs/gc/service_gc_%t.log -verbose:gc -XX:+PrintGCDetails \
      -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation \
      -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M \
      -javaagent:/opt/skywalking/agent/skywalking-agent.jar \
      -Dskywalking.agent.service_name=dms-service \
      -Dskywalking.agent.sample_n_per_3_secs=1 \
      -Dskywalking.collector.backend_service=skywalking-oap:11800 \
      -Dspring.profiles.active=${ACTIVE_PROFILE} -jar /app.jar

WORKDIR /
EXPOSE 9070

部分转自 https://www.cnblogs.com/chanshuyi/p/jvm_serial_11_jvm_param_heap_stack.html

JVM
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!