JVM调优,参数在哪里设置的?

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
JVM调优,参数在哪里设置的?


在Java应用程序中,JVM(Java Virtual Machine)的调优通常通过设置JVM启动参数来实现。这些参数可以控制JVM的内存分配、垃圾回收策略、线程管理、性能优化等方面。
1. JVM参数的位置

JVM参数通常在启动Java应用时通过命令行通报。设置JVM参数的常见方式有以下几种:


  • 命令行启动:利用 java 命令启动 Java 程序时,JVM参数通过 -X 或 -XX 前缀通报。
    比方:
    1. [/code] bash
    2. java -Xmx2g -Xms1g -XX:+UseG1GC -jar myapp.jar  上述命令设置了:
    3. [list]
    4. [*]最大堆内存为2GB:-Xmx2g
    5. [*]初始堆内存为1GB:-Xms1g
    6. [*]利用G1垃圾回收器:-XX:+UseG1GC
    7. [/list]
    8. [*] [b]配置文件[/b]:对于生产情况,通常会在启动脚本(如 .sh 或 .bat 文件)中配置这些JVM参数。
    9. 比方:
    10. [code]
    复制代码
    bash
    export JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC" java $JAVA_OPTS -jar myapp.jar
  • 容器化情况(如 Docker):在 Dockerfile 或 Docker Compose 中设置 JAVA_OPTS 情况变量,或直接通过 CMD 或 ENTRYPOINT 通报参数。
    比方:
    1. [/code] ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC" CMD java $JAVA_OPTS -jar /app/myapp.jar
    2. [/list] [size=3]2. [b]常见JVM调优参数[/b][/size]
    3. [size=2]内存设置相关参数[/size]
    4. [list]
    5. [*] [b]-Xms[/b]:设置JVM初始堆内存大小。
    6. [code]
    复制代码
    bash
    -Xms1g # 初始堆内存为1GB
  • -Xmx:设置JVM最大堆内存大小。
    1. [/code] bash
    2. -Xmx2g # 最大堆内存为2GB
    3. [*] [b]-Xmn[/b]:设置年轻代(Young Generation)内存大小,通常年轻代内存占堆内存的一部分。
    4. [code]
    复制代码
    bash
    -Xmn512m # 年轻代内存大小为512MB
  • -XX:NewSize-XX:MaxNewSize:分别设置年轻代的初始大小和最大大小。
    1. [/code] bash
    2. -XX:NewSize=512m # 初始年轻代大小为512MB -XX:MaxNewSize=1g # 最大年轻代大小为1GB
    3. [/list] [size=2]垃圾回收相关参数[/size]
    4. [list]
    5. [*] [b]-XX:+UseG1GC[/b]:启用G1垃圾回收器,G1是现在推荐的垃圾回收器,特别适用于大内存应用。
    6. [code]
    复制代码
    bash
    -XX:+UseG1GC
  • -XX:+UseParallelGC:启用并行垃圾回收器,适合多核CPU情况。
    1. [/code] bash
    2. -XX:+UseParallelGC
    3. [*] [b]-XX:+UseConcMarkSweepGC[/b]:启用CMS垃圾回收器(适用于低延迟需求)。
    4. [code]
    复制代码
    bash
    -XX:+UseConcMarkSweepGC
  • -XX:MaxGCPauseMillis:设置垃圾回收的目标最大停息时间(单位:毫秒)。
    1. [/code] bash
    2. -XX:MaxGCPauseMillis=200 # 设置垃圾回收的目标最大停息时间为200ms
    3. [/list] [size=2]性能调优相关参数[/size]
    4. [list]
    5. [*] [b]-XX:+PrintGCDetails[/b]:打印GC日志,详细输出每次GC的过程。
    6. [code]
    复制代码
    bash
    -XX:+PrintGCDetails
  • -XX:+PrintGCDateStamps:在GC日志中参加时间戳。
    1. [/code] bash
    2. -XX:+PrintGCDateStamps
    3. [*] [b]-XX:+HeapDumpOnOutOfMemoryError[/b]:在内存溢出时生成堆转储文件(heap dump)。
    4. [code]
    复制代码
    bash
    -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath:指定堆转储文件的存放路径。
    1. [/code] bash
    2. -XX:HeapDumpPath=/path/to/heapdump.hprof
    3. [/list] [size=2]线程管理相关参数[/size]
    4. [list]
    5. [*] [b]-XX:ThreadStackSize[/b]:设置每个线程的堆栈大小。
    6. [code]
    复制代码
    bash
    -XX:ThreadStackSize=256k # 设置线程栈大小为256KB
  • -XX:CICompilerCount:设置JIT(Just-In-Time)编译器的线程数目。
    1. [/code] bash
    2. -XX:CICompilerCount=4 # 利用4个JIT编译器线程
    3. [/list] [size=2]调试和日志相关参数[/size]
    4. [list]
    5. [*] [b]-Xlog:gc*[/b]:输出垃圾回收日志。
    6. [code]
    复制代码
    bash
    -Xlog:gc* # 输出GC的相关日志
  • -XX:+PrintCompilation:打印JIT编译的详细信息。
    1. [/code] bash
    2. -XX:+PrintCompilation
    3. [/list] [size=3]3. [b]JVM调优的常见工具[/b][/size]
    4. 除了直接设置JVM参数外,以下工具也可以资助你举行JVM性能调优和监控:
    5. [list]
    6. [*][b]JConsole[/b]:一个基于JMX的监控工具,可以监控JVM的堆内存、线程、类加载、GC等信息。
    7. [*][b]VisualVM[/b]:一个图形化工具,可以用来监控JVM性能、堆转储分析、线程分析等。
    8. [*][b]JProfiler[/b]:一个贸易化的Java性能分析工具,提供详细的堆内存分析、CPU分析等功能。
    9. [/list] [size=3]总结[/size]
    10. JVM调优紧张通过启动时的参数配置来实现,常见的调优方向包括内存管理(如堆大小、年轻代大小等)、垃圾回收策略、性能优化和日志记录。JVM启动参数的设置通常通过命令行、启动脚本或容器配置来实现,而且这些参数可以根据实际的应用需求和运行情况举行调整。
    11. [size=5]JVM调优,只设置了最大堆内存和初始堆大小,在哪里详细分配年轻代老年代大小[/size]
    12. 在 Java 中,JVM 的堆内存分为 [b]年轻代[/b](Young Generation)和 [b]老年代[/b](Old Generation)。它们的大小通常由以下两个方面控制:
    13. [list=1]
    14. [*] [b]-Xms 和 -Xmx[/b]:设置堆内存的初始大小(-Xms)和最大大小(-Xmx),但是这两个参数并没有直接控制年轻代和老年代的详细大小,而是控制整个堆的大小。
    15. [*] [b]-XX:NewRatio[/b]:用于控制年轻代和老年代的比例。默认情况下,JVM 会根据堆的大小分配肯定比例的内存给年轻代和老年代。如果没有指定 -XX:NewRatio,JVM 会根据默认值来决定。
    16. [*] [b]-XX:NewSize 和 -XX:MaxNewSize[/b]:这些参数可以显式地控制年轻代的大小。-XX:NewSize 用于设置年轻代的初始大小,-XX:MaxNewSize 用于设置年轻代的最大大小。
    17. [*] [b]-XX:SurvivorRatio[/b]:用于控制年轻代中 [b]Eden 区[/b] 和 [b]两个 Survivor 区[/b] 之间的内存比例。默认值通常是 8:1,即 Eden 区的大小是每个 Survivor 区的 8 倍。
    18. [*] [b]-XX:InitialTenuringThreshold[/b]:控制对象在年轻代中经历多少次 GC 后会被提升到老年代。
    19. [/list] [size=3]JVM 内存分配的细节:[/size]
    20. [list=1]
    21. [*] [b]-Xms 和 -Xmx[/b]:这些参数定义了堆的总内存大小,但并没有指定年轻代和老年代的详细分配。堆内存分为三个区域:
    22. [list]
    23. [*][b]年轻代[/b](Young Generation)包括 Eden 区和两个 Survivor 区。
    24. [*][b]老年代[/b](Old Generation)用于存储经过多次垃圾回收后仍然存活的对象。
    25. [*][b]元空间[/b](Metaspace)用于存储类元数据(对于 JDK 8 及以上版本)。
    26. [/list]
    27. [*] [b]年轻代和老年代的默认比例[/b]:
    28. [list]
    29. [*]默认情况下,JVM 会将堆内存的 [b]1/3[/b] 分配给年轻代,其余的分配给老年代。这种比例可以通过 -XX:NewRatio 参数举行调整。
    30. [/list]
    31. [/list] [size=3]控制年轻代和老年代大小的参数:[/size]
    32. [size=2]1. -XX:NewRatio[/size]
    33. 这个参数控制年轻代和老年代的比例。默认值通常是 [b]2[/b],意味着年轻代的内存大小是老年代的 1/2。比方,若堆内存大小为 6 GB,则默认情况下年轻代占 2 GB,老年代占 4 GB。
    34. [code]
    复制代码
    bash
    -XX:NewRatio=2
    2. -XX:NewSize 和 -XX:MaxNewSize

    这两个参数用于控制年轻代的初始大小和最大大小。-XX:NewSize 设置年轻代的初始大小,-XX:MaxNewSize 设置年轻代的最大大小。如果你想显式地控制年轻代的大小,可以利用这两个参数。
    1. [/code] bash
    2. -XX:NewSize=1G -XX:MaxNewSize=2G
    3. [size=2]3. -XX:SurvivorRatio[/size]
    4. 这个参数控制年轻代中的 Eden 区和 Survivor 区的内存比例。默认值是 [b]8[/b],即 Eden 区的内存大小是每个 Survivor 区的 8 倍。
    5. [code]
    复制代码
    bash
    -XX:SurvivorRatio=8
    4. -XX:InitialTenuringThreshold

    这个参数控制一个对象在年轻代中存活多少次 GC 后才会提升到老年代。默认值通常是 7,体现对象在经历 7 次 GC 后会被提升到老年代。
    1. [/code] bash
    2. -XX:InitialTenuringThreshold=7
    3. [size=3]总结:[/size]
    4. [list]
    5. [*][b]最大堆内存和初始堆内存[/b](-Xms 和 -Xmx)控制整个堆的大小。
    6. [*][b]年轻代和老年代的比例[/b]:通过 -XX:NewRatio 控制。
    7. [*][b]年轻代的大小[/b]:可以通过 -XX:NewSize 和 -XX:MaxNewSize 明白指定。
    8. [*][b]年轻代内部区域的比例[/b]:通过 -XX:SurvivorRatio 控制 Eden 区和 Survivor 区的大小比例。
    9. [/list] 通过这些参数,您可以根据应用程序的需求调整内存分配,以便更好地满意性能和垃圾回收的需求。
    10. [size=5]-XX:NewRatio:用于控制年轻代和老年代的比例 ,这个比例在哪里配置的[/size]
    11. 现在我无法直接提供截图,但我可以通过笔墨阐明资助你理解在哪里配置 -XX:NewRatio 参数。
    12. [size=3]配置方法[/size]
    13. [list=1]
    14. [*] [b]JVM 启动命令行中配置[/b]:
    15. [list]
    16. [*]-XX:NewRatio 是通过在 [b]JVM 启动命令[/b]中设置的。如果你正在运行 Java 程序,可以在启动时通过命令行指定此参数。
    17. [/list]
    18. [*] [b]示例:[/b] 假设你通过命令行启动 Java 应用程序,可以在启动命令中添加 -XX:NewRatio 来控制年轻代和老年代的比例。以下是一个常见的例子:
    19. [code]
    复制代码
    bash
    java -XX:NewRatio=2 -jar your-application.jar  这条命令中,-XX:NewRatio=2 将设置年轻代和老年代的内存比例为 1:2。
在常见的情况中的配置方式



  • Eclipse:如果你在 Eclipse 中运行应用程序,可以通过以下步骤配置:

    • 右键点击你的 Java 项目。
    • 选择 Run As → Run Configurations
    • 选择你要运行的配置。
    • 在 Arguments 标签下,在 VM arguments 中添加 -XX:NewRatio=2。

  • IntelliJ IDEA:如果你在 IntelliJ IDEA 中运行 Java 应用程序,可以通过以下步骤配置:

    • 打开你的项目。
    • 点击 Run → Edit Configurations
    • 在 VM options 中添加 -XX:NewRatio=2。

  • Tomcat 或其他应用服务器:如果你利用的是 Tomcat 或其他应用服务器,可以在服务器启动配置文件中(如 catalina.sh 或 setenv.sh)添加此参数。
总结



  • -XX:NewRatio 参数通过 JVM 启动时的命令行配置来控制年轻代和老年代的内存比例。
  • 配置示例:java -XX:NewRatio=2 -jar your-application.jar。
  • 你可以在 IDE 或应用服务器的启动配置中设置这个参数。
以Dokcer为例 -XX:NewRatio:用于控制年轻代和老年代的比例 ,这个比例在哪里配置的,请给出截图

固然我无法直接提供截图,但我可以详细解释如何在 Docker 容器中配置 JVM 参数(如 -XX:NewRatio)来控制年轻代和老年代的比例。
1. 通过 Dockerfile 配置

Dockerfile 中,你可以通过设置 CMD 或 ENTRYPOINT 来指定 JVM 参数。在 Docker 镜像构建过程中,可以将 -XX:NewRatio 参数添加到 Java 启动命令中。
示例 Dockerfile 配置:

  1. [/code] # 利用 Java 官方镜像 FROM openjdk:17-jdk # 将应用程序 JAR 文件添加到容器中 COPY your-application.jar /app/your-application.jar # 配置 JVM 参数来控制年轻代和老年代的比例 CMD ["java", "-XX:NewRatio=2", "-jar", "/app/your-application.jar"]
  2. [size=3]2. [b]通过 docker run 命令配置[/b][/size]
  3. 如果你已经有一个 Docker 镜像,而且想要在运行时动态添加 JVM 参数(比方 -XX:NewRatio),可以在利用 docker run 命令时指定这些参数。
  4. [size=2]示例 docker run 命令:[/size]
  5. [code]
复制代码
bash
docker run -d -e JAVA_OPTS="-XX:NewRatio=2" your-docker-image
然后,确保在容器内部的启动命令中利用了 JAVA_OPTS 情况变量,比方:
  1. [/code] CMD ["sh", "-c", "java $JAVA_OPTS -jar /app/your-application.jar"]
  2. 这样,JAVA_OPTS 情况变量中的 -XX:NewRatio=2 就会被通报给 JVM。
  3. [size=3]3. [b]利用 Docker Compose 配置[/b][/size]
  4. 如果你利用 Docker Compose 来管理容器,可以在 docker-compose.yml 文件中配置 JVM 参数。
  5. [size=2]示例 docker-compose.yml 配置:[/size]
  6. [code]
复制代码
version: '3.8' services: java-app: image: openjdk:17-jdk build: context: . environment: - JAVA_OPTS=-XX:NewRatio=2 command: ["sh", "-c", "java $JAVA_OPTS -jar /app/your-application.jar"] volumes: - ./your-application.jar:/app/your-application.jar
总结



  • 在 Docker 中,你可以通过 Dockerfiledocker run 命令或 Docker Compose 来配置 -XX:NewRatio 参数,控制年轻代和老年代的比例。
  • 通过 CMD 或 ENTRYPOINT 指定 JVM 启动参数,将其通报给 Java 应用程序。
固然我无法直接给出截图,但以上步骤应能资助你在 Docker 容器中配置 Java 参数。如果你需要更详细的操作阐明或碰到其他问题,欢迎随时提问!
项目中如何配置的?

DokckerFile

  1. FROM x.com/saicmotorcv/java:8
  2. MAINTAINER wanghuapeng <wanghuapeng@saicmotor.com>
  3. ENV TZ=Asia/Shanghai
  4. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  5. COPY /x-service/target/yl-tasks-jghc-service-0.0.1.jar /app/app.jar
  6. COPY /x-service/start.sh /app
  7. COPY /x-service/start2.sh /app
  8. COPY /x-service/skywalking-agent /app/agent
  9. EXPOSE 9600
  10. ENTRYPOINT ["/bin/bash","/app/start.sh"]
复制代码
start.sh

  1. #!/bin/bash
  2. SERVICEIP=` ip a|grep /32| awk  '{print $2}'|cut -d / -f1`
  3. if [ "$ZH_APP_MEM" == "" ]; then
  4.   vmMemory=" -Xms2G -Xmx2G "
  5. else
  6.   vmMemory=" -Xms$ZH_APP_MEM -Xmx$ZH_APP_MEM "
  7. fi
  8. flag=0
  9. inst_name=${LOGFORMAT##*/}
  10. ret=`curl -s http://ip.sxc.sh/service/${inst_name}/text`
  11. ip_str=${ret%%]*}
  12. wan_ip=${ip_str#*[}
  13. port_str=${ret##*[}
  14. wan_port=${port_str%%:*}
  15. if [ -n "$(echo $wan_port| sed -n "/^[0-9]\+$/p")" ];then
  16.     flag=1
  17. fi
  18. check=`echo $wan_ip|grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$"`
  19. if [[ ${#check} -eq ${#wan_ip} && $flag -eq 1 ]]; then
  20.     flag=2
  21. fi
  22. if [ $flag -ne 2 ]; then
  23.     wan_ip=""
  24.     wan_port=""
  25. fi
  26. echo $wan_ip
  27. echo $wan_port
  28. if [ -n "$shost" ] ;then
  29.   echo "wan ip and port is define $shost:$sport"
  30.   SERVICE_HOST=$shost
  31.   SERVICE_PORT=$sport
  32. elif [ -n "$wan_port" ] ;then
  33.   echo "wan ip and port is define $wan_ip:$wan_port"
  34.   SERVICE_HOST=$wan_ip
  35.   SERVICE_PORT=$wan_port
  36. fi
  37. javaagent="-javaagent:/app/agent/skywalking-agent.jar=agent.service_name=$SKYWALKING_NAME,collector.backend_service=${SKYWALKING_SERVICE}"
  38. echo "serviceip:$SERVICEIP"
  39. echo "SKYWALKING_NAME:$SKYWALKING_NAME"
  40. echo "SKYWALKING_SERVICE:$SKYWALKING_SERVICE"
  41. java  $javaagent \
  42.      -server -jar $vmMemory \
  43.      -Duser.timezone=GMT+08 \
  44.      -XX:+UseConcMarkSweepGC \
  45.      /app/app.jar \
  46.      --spring.cloud.consul.discovery.hostname=$SERVICE_HOST \
  47.      --spring.cloud.consul.discovery.port=$SERVICE_PORT \
  48.      --spring.cloud.consul.discovery.healthCheckUrl=http://$SERVICE_HOST:$SERVICE_PORT/base/health \
  49.      --spring.profiles.active=\${env} \
  50.      --xxl.job.executor.register.port=\${xxl-job-port} \
  51.      --xxl.job.executor.register.ip=$SERVICE_HOST
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表