掌握 JVM 的参数及配置

news2024/11/14 19:30:54

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

JVM(Java虚拟机)是Java编程语言的核心组件之一,它负责执行Java程序,并提供一系列参数和配置选项,可以调整Java程序的行为和性能。

1

JVM 参数

e1dc0140985b0f4fa143efcfefbb5756.png

JVM 参数主要有 3 类:标准参数,非标准参数,高级参数。

1、标准参数(Standard Options)

标准参数所有的 Java 虚拟机都支持,用于常见操作,例如:检查 Java 版本,查看 java 命令的用法等,标准参数以“-”开头。

-version :查看 Java 版本

-help :查看 java 命令的使用帮助

2、非标准参数(Non-Standard Options)

非标准参数不能保证所有 Java 虚拟机都支持它们,不同的 JDK 版本可能会发生变化,这些参数以“-X”开头。

-Xmixed:混合模式执行 (默认)

-Xint:仅解释模式执行

-Xms<size>:设置堆的初始大小

-Xmx<size>:设置内存分配池的最大大小

-Xss<size>:设置线程堆栈大小

CMD 里运行 java -X 命令,可以显示所有可用 -X 参数的说明。

3、高级参数(Advanced Options)

开发人员使用最多的参数,用于 JVM 调优和 debug,不同的 JDK 版本可能会发生变化,这些参数以 “-XX” 开头。

“-XX” 参数有 2 种类型:Boolean 类型和需要参数的类型。

Boolean 类型:用于启用默认情况下禁用的功能,或者禁用默认情况下启用的功能,此类选项不需要参数。

格式:-XX:[+-] <OptionName>, “+” 或 “-” 表示启用或者禁用 OptionName 属性。

-XX:+UseConcMarkSweepGC  表示启用 CMS 垃圾收集器

-XX:+UseG1GC  表示启用 G1 垃圾收集器

-XX:+PrintCommandLineFlags  表示启用打印 JVM 设定的值,例如堆空间大小和选定的垃圾收集器

需要指定参数值的类型:用于指定某个参数为某个值。

格式:-XX:<OptionName>=<value>,表示 OptionName 属性的值是 value。

-XX:ThreadStackSize=size 设置线程堆栈大小(以字节为单位),字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。“-XX:ThreadStackSize ”等效于 “-Xss”。

-XX:InitialHeapSize=size 设置内存分配池的初始大小(以字节为单位),此值必须为 0 或 1024 的倍数且大于 1 MB,“-XX:InitialHeapSize”等效于 “-Xms”。

-XX:MaxHeapSize=size 设置内存分配池的最大大小(以字节为单位),此值必须是 1024 的倍数且大于 2 MB,“-XX:MaxHeapSize ”等效于 “-Xmx”。

-XX:MaxGCPauseMillis=time 设置最大 GC 暂停时间的目标(以毫秒为单位)

4、以下是一些常见的JVM参数和配置选项:

-classpath:指定类路径,可以包括多个目录和JAR文件。

-verbose:启动JVM时输出详细信息,包括类加载、内存分配和线程启动等。

-version:显示JVM版本信息。

-showversion:启动JVM时显示版本信息。

-X:使用非标准选项启动JVM,可以指定各种参数和配置选项。

-Xmx:设置JVM最大堆内存大小,例如-Xmx2G表示最大堆内存为2GB。

-Xms:设置JVM初始堆内存大小,例如-Xms512M表示初始堆内存为512MB。

-XX:PermSize 和 -XX:MaxPermSize:设置永久代(PermGen)的初始大小和最大大小。

-XX:+UseConcMarkSweepGC:使用并发标记清除(CMS)垃圾回收器。

-XX:+UseParallelGC:使用并行垃圾回收器。

-XX:+PrintGC:启动垃圾回收时输出垃圾回收信息。

-XX:+PrintGCDetails:启动垃圾回收时输出详细的垃圾回收信息。

-Xloggc:指定垃圾回收日志文件的路径和名称。

-XX:ParallelGCThreads:指定并行垃圾回收线程数。

-XX:MaxDirectMemorySize:设置直接内存的最大大小。

这些参数和配置选项可以用来调整JVM 的行为和性能,以便更好地适应不同的应用场景和硬件环境。

JDK 8 的参数官方链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDCEGG 

大家可以自行研究。

2

JVM 参数配置的方式

0395713234a281ca8954c8793e009b0a.png

1、开发工具中设置:IDEA,eclipse。

2、命令行运行 jar 包的时候设置:java -Xmx1024m -Xms1024m -jar xxx.jar

3、tomcat 容器设置:tomcat 启动执行的是 tomcat/bin/startup.sh,startup.sh 执行的是 catalina.sh,所以要在 catalina.sh 中进行设置,修改JAVA_OPTS配置。

JAVA_OPTS="-server -Xms8g -Xmx8g -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/gclogs/dump/heap.hprof -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/gclogs/gc.log -XX:+DisableExplicitGC"

3b90c9e54b1a89a8d7c97274a1fcf101.png

以上各参数含义:

-server:表示这是服务器虚拟机

-Xms8g:设置 JVM 最小内存为 8g,可以与 -Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存

-Xmx8192m:设置 JVM 最大可用内存为 8g

-XX:NewRatio=4:设置新生代(包括 Eden 和两个 Survivor 区)与老年代的比值,设置为 4,则表示新生代:老年代=1:4,也就是新生代占整个堆内存的1/5。

-XX:SurvivorRatio=8:新生代中 Eden 区与 Survivor 区的比值,设置为 8 表示 Eden:(S0+S1)=2:8,也就是一个 Survivor 区占整个新生代的 1/10。

-XX:+UseConcMarkSweepGC:设置老年代使用 CMS 并发收集器,它的主要适合场景是对响应时间的需求大于对吞吐量的需求,能够承受垃圾回收线程和应用线程共享 CPU 资源,并且应用中存在比较多的长生命周期对象。CMS 并发收集器的目标是尽量减少应用的暂停时间(STW),减少 Full GC 发生的概率,利用和应用程序线程并发的垃圾回收线程来标记清除老年代内存。

-XX:ParallelGCThreads=8:表示 JVM 在进行并行 GC 的时候,用于 GC 的线程数

-XX:+HeapDumpOnOutOfMemoryError:启动堆内存溢出打印,当 JVM 堆内存发生溢出时(OOM),自动生成 dump 文件

-XX:HeapDumpPath:生成DUMP文件的路径,表示在 /usr/local/gclogs/dump 目录生成一个 heap.hprof文件;如不设置,默认存储在 jvm 运行环境目录。

-XX:+PrintGCDetails:打印 GC 详细信息,记录 GC 日志并不会特别地影响 Java 程序性能

-XX:+PrintGCDateStamps:允许在每个GC上打印日期戳

-Xloggc:指定 GC log 的位置为 /usr/local/gclogs,将详细的 GC 事件信息重定向到 gc.log 文件

-XX:+DisableExplicitGC:忽略手动调用 GC 的代码使得 System.gc() 的调用不会触发任何 GC

通过 jinfo 实时调整某个 java 进程的参数(只有被标记为 {manageable} 的参数可以被实时修改),后续详细介绍该命令。

3

查看 JVM 参数,打印 XX 选项及值

0770e8b5a61afaba80a3538ad0a62549.png

-XX:+PrintCommandLineFlags  表示启用打印 JVM 设定的值,例如堆空间大小和选定的垃圾收集器

-XX:+PrintFlagsInitial 表示打印出所有 XX 选项的默认值

-XX:+PrintFlagsFinal 表示打印出所有 XX 选项在程序运行时实际的值

在程序运行前设置以上的选项,如下图:

70963f4fc54b16768178718290e62399.png

运行可以打印出类似下面的内容,只截取了一部分信息:

94e8d86e8612daac353256ed78fe6c38.png

输出的值 "=" 表示默认值,":=" 表示被用户或 JVM 修改后的值,{product} 表示官方支持的 JVM 内部选项,{manageable} 表示外部定义的并且是可动态写入的。

在开发工具启动参数里设置:-Xmx20M -Xms10M -XX:+PrintFlagsFinal,我们来观察默认的参数值和修改后的参数值,如下:

e0870c7af15c1d084cfb74e506ab4dff.png

结束语。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/838962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探秘企业DevOps一体化平台建设终极形态丨IDCF

笔者从事为企业提供研发效能改进解决方案相关工作十几年&#xff0c;为国内上百家企业提供过DevOps咨询及解决方案落地解决方案&#xff0c;涉及行业包括&#xff1a;金融、通信、制造、互联网、快销等多种行业。 DevOps的核心是研发效能改进&#xff0c;效能的提升离不开强大…

Linux基本开发工具(一)

文章目录 Linux基本开发工具&#xff08;一&#xff09;Linux安装和卸载软件Linux 软件包管理器 yum关于sudo命令关于yum源的换源问题 vim编辑器的使用vim三种模式&#xff08;常见&#xff09;vim的基本操作vim配置 Linux基本开发工具&#xff08;一&#xff09; Linux安装和…

Dubbo中使用netty

技术主题 netty在Dubbo中的使用,主要集中在网络通信上, 技术原理 Dubbo是什么 高性能、轻量级的开源java的RPC框架,提供三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 Dubbo的传输结构 1、魔数标识符(四个字节),用于区分不同…

机器人开发--兴颂雷达介绍

机器人开发--兴颂雷达介绍 1 介绍2 使用手册参考 1 介绍 佛山市兴颂机器人科技有限公司&#xff08;Hinson&#xff09;是一家集研发、设计、生产、销售机器人(AGV)导航核心零部件、并提供整体运动控制方案的自主创新型国家高新技术企业。 2 使用手册 兴颂激光雷达使…

HDFS中的sequence file

sequence file序列化文件 介绍优缺点格式未压缩格式基于record压缩格式基于block压缩格式 介绍 sequence file是hadoop提供的一种二进制文件存储格式一条数据称之为record&#xff08;记录&#xff09;&#xff0c;底层直接以<key, value>键值对形式序列化到文件中 优…

【flink】开启savepoint

先启动一个任务 flink run -c com.yang.flink.CDCJob test-cdc.jar开启savepoint 命令&#xff1a; flink savepoint JobID 文件地址 flink savepoint e929a11d79bdc5e6f140f2cfb92e1335 file:///workspace/flinkSavepoints/backend这样就开启好了 操作中的错误 详细信…

HTTP——八、确认访问用户身份的认证

HTTP 一、何为认证二、BASIC认证BASIC认证的认证步骤 三、DIGEST认证DIGEST认证的认证步骤 四、SSL客户端认证1、SSL 客户端认证的认证步骤2、SSL 客户端认证采用双因素认证3、SSL 客户端认证必要的费用 五、基于表单认证1、认证多半为基于表单认证2、Session 管理及 Cookie 应…

【ONE·Linux || 基础IO(二)】

总言 文件系统与动静态库相关介绍。 文章目录 总言2、文件系统2.1、背景知识2.2、磁盘管理2.2.1、磁盘文件系统图2.2.2、inode与文件名 2.3、软硬链接 3、动静态库3.1、站在编写库的人的角度&#xff1a;如何写一个库&#xff1f;3.1.1、静态库制作3.1.3、动态库制作 3.2、站在…

初识MySQL数据库之用户管理

目录 一、用户管理 二、用户 1. 用户信息 2. 创建用户 3. 用户登录测试 4. 删除用户 5. 设置用户远端登录 6. 修改密码 6.1 修改当前用户的密码 6.2 root用户修改指定用户的密码 三、权限 1. 数据库中的各个权限含义 2. 给用户授权 3. 查看用户拥有权限 4. 授权…

VSCode---通过ctrl+鼠标滚动改变字体大小

打开设置然后在右边输editor.mouseWheelZoo勾选即可实现鼠标滚动改变字体大小 4.这种设置的字体大小是固定的

Wordpress升级版本后插件和主题常见出错及处理方法整理【持续更新】

Wordpress报错怎么解决&#xff1f; 一般常用的排查方法&#xff1a; 暂时禁用所有插件&#xff1b;将主题更改为默认主题&#xff1b; 修改wp-config.php文件&#xff1b;更新固定链接设置&#xff0c;确保设置正确&#xff1b;检查.htaccess文件是否存在且是否可写&#xf…

IL汇编实现两数相加输出结果

话说前面没有实现IL汇编2数相加&#xff1b;鼓捣了一下&#xff0c;实现的代码如下&#xff1b; .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 8.entrypoint.locals init (int32 V_0, int3…

数据集成、类的派生树、算子、软件核化。

数据集成、类的派生树、算子、软件核化TOC 数据集成&#xff1a;数据集成首先需要对数据进行分类、组织、排序&#xff0c;然后按照一定的规则合成、展示数据&#xff08;可以是生成式网页数据&#xff09;。对于元宇宙、大数据、大模型、基于搜索的计算、数据集成都是提高效率…

SpringBoot中Redis报错:NOAUTH Authentication required

1、问题 org.springframework.dao.InvalidDataAccessApiUsageException: NOAUTH Authentication required.; nested exception is redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required. … 2、解决 如果提供了密码还没解决&#xff0c;那可能是…

2021-06-16 Multisim74LS161S设计13进制计数器!

缘由求&#xff01;74LS161S设计13进制计数器&#xff01;-其他-CSDN问答

从URL取值传给后端

从URL传值给后端 http://127.0.0.1:8080/blog_content.html?id8点击浏览文章详情&#xff0c;跳转至详情页面 从 url 中拿出文章 id&#xff0c;传给后端 首先拿到url然后判断是否有值&#xff0c;从问号后面取值params.split(&) 以 & 作为分割然后遍历字符数组 param…

SQL分类及通用语法数据类型(超详细版)

一、SQL分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库…

在消费级GPU调试LLM的三种方法:梯度检查点,LoRA和量化

LLM的问题就是权重参数太大&#xff0c;无法在我们本地消费级GPU上进行调试&#xff0c;所以我们将介绍3种在训练过程中减少内存消耗&#xff0c;节省大量时间的方法:梯度检查点&#xff0c;LoRA和量化。 梯度检查点 梯度检查点是一种在神经网络训练过程中使动态计算只存储最…

瞄准产业应用,大模型加持的深兰科技AI虚拟数字人落地业务场景

伴随ChatGPT的问世&#xff0c;在技术与商业运作上都日渐发展成熟的AI数字人产业正持续升温。 目前的AI数字人不仅拥有超高“颜值”&#xff0c;同时还拥有更为丰富的、细腻的表情和动作。更有甚者&#xff0c;AI数字人已经具备自定义构建知识图谱、自主对话、不断学习成长的能…

day3-牛客67道剑指offer-JZ31、JZ32、JZ33、JZ34、JZ35、JZ36、JZ38、JZ39、JZ40、JZ42、链表中倒数第k个

文章目录 1. JZ31 栈的压入、弹出序列辅助栈原地栈 数组模拟 2. JZ32 从上往下打印二叉树迭代递归 3. JZ33 二叉搜索树的后序遍历序列递归迭代 递增栈 4. JZ34 二叉树中和为某一值的路径(二)5. JZ35 复杂链表的复制6. JZ36 二叉搜索树与双向链表递归迭代 7. JZ38 字符串的排列n…