网站首页 > 精选教程 正文
JVM(Java虚拟机)是Java编程语言的核心组件之一,它负责执行Java程序,并提供一系列参数和配置选项,可以调整Java程序的行为和性能。
1
JVM 参数
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 参数配置的方式
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"
以上各参数含义:
-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 选项及值
-XX:+PrintCommandLineFlags 表示启用打印 JVM 设定的值,例如堆空间大小和选定的垃圾收集器
-XX:+PrintFlagsInitial 表示打印出所有 XX 选项的默认值
-XX:+PrintFlagsFinal 表示打印出所有 XX 选项在程序运行时实际的值
在程序运行前设置以上的选项,如下图:
运行可以打印出类似下面的内容,只截取了一部分信息:
输出的值 "=" 表示默认值,":=" 表示被用户或 JVM 修改后的值,{product} 表示官方支持的 JVM 内部选项,{manageable} 表示外部定义的并且是可动态写入的。
在开发工具启动参数里设置:-Xmx20M -Xms10M -XX:+PrintFlagsFinal,我们来观察默认的参数值和修改后的参数值,如下:
后面将为大家介绍 JVM 调优。
猜你喜欢
- 2024-11-01 关于启动电容器的匹配 启动电容器怎么接线
- 2024-11-01 冷水机的基本运行参数包括哪些? 冷水机参数含义
- 2024-11-01 Java线程池解读:从入门到精通,核心参数全掌握!
- 2024-11-01 使用Java编写求和的代码 使用java编写求和的代码是什么
- 2024-11-01 稳压器启动电流多大? 稳压器输出多少正常
- 2024-11-01 Java容器化参数配置最佳实践 java容器有哪几种
- 2024-11-01 Java变量 java变量的数据类型分为两种
- 2024-11-01 深入理解JVM运行原理:从内存布局到执行流程的全面解析
- 2024-11-01 丹佛斯VLT2900变频器维修后试运行参数设置方法及教...
- 2024-11-01 Java 21:有什么新变化? java+21:有什么新变化?举例说明
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)