首页 > 其他分享 >JVM 参数配置

JVM 参数配置

时间:2024-08-14 16:40:06浏览次数:8  
标签:JVM 配置 回收 XX 参数 内存 设置 垃圾

JVM 参数设置入门案例

JVM 的内存参数众多,但是在实际应用中主要关注堆内存的大小设置及堆内存中新生代和老年代的大小设置,下面看一个简单的 JVM 启动参数设置案例:

java -server
-Xms3g -Xmx3g
-XX:NewSize=1g
-XX:MetaspaceSize=128m
-XX:NewRatio=3
-XX:SurvivorRatio=8
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.log -jar start.jar

-Xms -Xmx:-Xms 表示初始堆大小,-Xmx 表示最大堆大小。一般将 Xms 和 Xmx 设置为相同的值,避免垃圾回收后 JVM 重新分配堆内存大小而引起内存震荡,影响性能。可将堆内存的大小简单理解为 JVM 在运行过程中可用到的总内存大小。

-XX:NewSize:-XX:NewSize=1g 表示设置新生代的大小为 1GB,一般建议设置为总堆内存的 1/3

-XX:MetaspaceSize:表示元空间的大小为 128MB,当要加载的类库过多时,可以适当调高这个值

-XX:NewRatio:-XX:NewRatio=3 表示设置新生代与老年代的比值为 1:3,因此新生代占整个堆栈的 1/4,老年代占整个堆内存的 3/4

-XX:SurvivorRatio: -XX:SurvivorRatio=8 表示 Eden 区和两个 Survivor 区的比值为 8:1,即 Eden:SurvivorTo=8:1、Eden:SurvivorFrom=8:1。最终的结果是 Eden:SurvivorTo:SurvivorFrom=8:1:1

-XX:+UseParNewGC XX:+UseConcMarkSweepGC:垃圾回收器设置 -XX:+UseParNewGC 表示设置年轻代垃圾回收器为 ParNew 垃圾回收器。-XX:+UseConcMarkSweepGC 表示设置老年代垃圾回收器为 CMS 垃圾回收器

-OOM异常诊断设置:XX:HeapDumpOnOutOfMemoryError 表示当发生 OOM 时转储堆到文件。XX:HeapDumpPath 表示堆的转储文件路径地址。这两个参数结合起来,可以在程序出现 OOM 时及时将堆信息打印出来,方便后续分析故障


JVM 参数设置实战

在进行 JVM 参数设置时需要重点关注垃圾回收器的设置和 JVM 内存的设置。接下以在一个 8GB 的服务器上独立运行一个名为 start.jar 的 Netty 应用服务为例,介绍内存设置的流程

  1. 预留操作系统内存:首先确定操作系统的总内存为 8GB,为操作系统预留 2GB 内存,保障操作系统运行流畅,将剩余的 6GB 内存分配给应用程序
  2. 确定直接内存:由于我们的应用程序为 Netty 服务端,Netty 服务在运行过程中会使用直接内存来提高性能,因此应用程序在运行过程中会有大量直接内存的使用。为了保障应用程序既有足够的直接内存保障服务高效运行,又不至于占用过多堆外内存导致系统内存不足而产生 OOM 问题,我们将 2GB(应用程序可用内存的1/3)内存预留给直接内存,通过 -XX:MaxDirectMemorySize-2g 设置可用的最大堆外内存为 2GB。在使用过程中会按需分配足够的内存给直接内存,但最大不超过 2GB
  3. 确定 Java 堆的大小:剩余的 4GB 内存,将 3GB 分配给 Java 堆,这样就可以确定 -Xm3g -Xmx3g
  4. 确定新生代和老年代的大小:由于没有特殊的大对象和过多长生命周期的对象,所以可以将堆内存的 1/3 分配给新生代,也就是 -XX:NewSize=1g,将其他剩余的 2GB 内存分配给老年代。同时,由于我们的程序为一般的 Java 程序,所以 Survivor 区和 Eden 区的配置可以采用官网建议的值,这里不做特殊设置
  5. 确定元空间区:接下来还剩余 1GB 内存可供应用程序使用,由于应用程序及其依赖的 JAR 包不大,所以可通过 XX:MetaspaceSize=128m 设置元空间大小为 128MB。将剩余的少部分内存留给操作系统或者其他应用程序使用
  6. 配置 GC:最后设置垃圾回收器、OOM 异常数据转储路径和 GC 日志。使用 -XX:+UserConcMarkSweepGC 可设置老年代使用 CMS 垃圾回收器,新生代使用默认的 ParNew 垃圾回收器。使用 -XX:+UseG1GC 可设置使用 G1 垃圾回收器

具体配置如下:

java -server
-XX:MaxDirectMemorySize=2g # 直接内存的大小为 2GB
-Xms3g -Xmx3g # Java 堆内存的大小为 3GB
-XX:NewSize=1g # 新生代的大小为 1GB
-XX:MetaspaceSize=128m # 元空间为 128MB
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC # 新生代使用 ParNewGC,老年代使用 CMS
-xx:+HeapDumponCutOfMemoryError # 在发生 OOM 时打印日志
-XX:HeapDumpPath=dump.log # OOM 日志存储地址
-XX:+PrintGC # 输出 GC 日志
-XX:+PrintGCDetails # 输出 GC 的详细日志
-XX:+PrintGCDatestamps # 输出 GC 的时间戳
-XX:+PrintHeapAtGC # JVM 在执行 GC 操作的前后打印堆的信息
-Xlogge:../gc/gc.log # GC日志的输出地址
-jar start.jar

另外,需要注意不同 JVM 版本的配置参数不同,比如 -XX:PermSizeXX-XX:MaxPermsize 分别表示永久代的初始化大小和永久代的最大大小。但是在 Java8 已经没有永久代了,因此也不存在该配置参数。

标签:JVM,配置,回收,XX,参数,内存,设置,垃圾
From: https://www.cnblogs.com/Yee-Q/p/18359152

相关文章

  • k8s中配置Spring Cloud服务(Eureka客户端)优雅上下线
    目录背景解决办法Pod容器终止流程模拟请求报错发布服务请求接口基于Eureka优雅上下线正确的做法修改deployment配置发布服务背景在Kubernetes部署应用时,尽管Kubernetes使用滚动升级的方式,先启动一个新Pod,等新Pod成功运行后再删除旧Pod,但在此过程中,Pod仍然会接收请求。如果在Pod......
  • Vue3+Vite项目从零搭建+安装依赖+配置按需导入
    环境准备Vscode/HBuilder等任何一种前端开发工具node.js&npm本地开发环境源代码管理:Git技术栈项目构建创建项目npmcreatevite依次运行最后三行出现,成功启动项目在浏览器输入http://localhost:5173/可以显示页面src别名的配置在开发项目的时候文件与文件......
  • 【Nginx】nginx案例-配置文件
      案例一、【web服务应用】七层反向代理,负载均衡,动静分离 vim/usr/local/nginx/conf/nginx.conf......http{......#gzipon;#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大upstreamtomcat_server{server1......
  • ollama的set parameter的参数的注解
    >>>/setparameterAvailableParameters:/setparameterseed<int>Randomnumberseed/setparameternum_predict<int>Maxnumberoftokenstopredict/setparametertop_k<int>Pickfromtopk......
  • 身份证实名认证类接口怎么选择?JavaScript身份证三要素核验接口返回参数说明
    当我们在选择身份证实名认证接口的时候,首先要考虑的是接口的稳定性和可靠性,翔云身份证实名认证接口,一般是指通过身份证三要素:身份证号、姓名、证件人像核验的方式来对身份证真伪的一致性进行核验,且接口的部署方式简单便捷。翔云身份证核验接口返回参数说明序号 名称 类......
  • 【C++ Allocator】 详解C++的空间配置器和vector的底层实现以及push_back()和empalce_
    空间配置器用于管理动态内存分配和释放,STL容器类(如std::vector,std::list,std::map等)都使用配置器来管理内存。它有非常重要的特点:将容器的内存开辟和对象构造分离开将容器的对象析构和内存释放分离开这样能够高效的插入元素以及删除元素vectorSTL中典型的容器vec......
  • springboot配置文件0开头的数字自动被转换成为其他值/与原值不匹配: 000000转为0
    在springboot配置文件需要使用字符串类型的数值时候,有时候直接写一个0开头的数值,例如001。配置生效之后,打印配置参数时候发现不对,输出的是数值1。而yml中配置的:000000,输出的是:0publicclassConstructYamlIntextendsAbstractConstruct{publicConstructYamlInt(){......
  • JVM及其内存结构划分
    JVMJVM是什么?Java虚拟机(JVM)是一个可以执行Java字节码的虚拟机。它是一种抽象的计算机,具有自己的指令集和运行环境。JVM的主要工作是加载Java字节码(.class文件),然后执行这些字节码。JVM的作用平台无关性:JVM使得Java程序能够在任何安装了JVM的操作系统上运行,实现了所谓的“一次......
  • 5G 中兴 随身WIFI 6 产品参数
    产品参数工艺尺寸18.5*133*73mm重量150g制式5GuFi(SA&NSA)Support:5GNR5GNR+LTEEN-DCLCD2.4寸触摸屏电池4500MHA适配器5V/3A芯片无线芯片高通路由和WIFI芯片高通主芯片型号SDX55处理器信息SDX55MArmCortex-A7upt......
  • linux配置Maxwell
    1、Maxwell-1.30.0及以上的版本不再支持JDK1.8,而JDK1.8支持的最后一个版本为1.29.22、下载Maxwell的压缩包,上传到服务器并解压3、tar -xf maxwell-1.29.2.tar.gz4、开启mysql的binlog功能:vim /etc/my.cnfserver-id=1log-bin=mysql-binbinlog_format=row并重新加载配置项:s......