深入理解jvm启动参数

 更新时间:2023年08月23日 10:21:37   作者:一户董  
JVM的启动参数是在启动JVM时可以设置的一些命令行参数,本文详细的介绍了深入理解jvm启动参数,具有一定的参考价值,感兴趣的可以了解一下

写在前面

本文一起看下jvm启动参数相关内容,通过本文希望我自己也希望大家能够真正的应用到实际的工作中。

1:基本内容介绍

一般我们启动java程序有两种方式,一种是直接运行一个有main函数的class,第二种是运行一个在MANIFEST文件中指定了main类的jar包,格式分别如下:

class文件格式:
    java [options] classname [args]
jar包格式:
    java [options] jarfilename [args]

其中[options]就是我们本文要分析的jvm的参数配置,[args]是main函数的参数即main(String[] arags)中的args

参数具体可以分为标准参数,非标准参数,系统属性参数等,分别来看下。

标准参数
标准参数是以-开头的参数,这种参数是所有的JVM都会实现和支持的,并且会一直兼容,如-server 设置jvm的运行模式。

系统属性参数
系统属性参数通过-D设置,如-Dfile.encoding=UTF-8,设置编码。

非标准参数
非标准参数通过 -X 设置,这种参数并不保证所有JVM的都支持,并且不保证向后兼容,如 -Xms2g -Xmx4g,可以通过java -X查看当前jvm支持非标准参数都有哪些,如下:

bogon:~ xb$ java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
bogon:~ xb$ java -X
    -Xbatch           禁用后台编译
    -Xbootclasspath/a:<directories and zip/jar files separated by :>
                      附加在引导类路径末尾
    -Xcheck:jni       对 JNI 函数执行其他检查
    -Xcomp            在首次调用时强制编译方法
    -Xdebug           为实现向后兼容而提供
    -Xdiag            显示附加诊断消息
    -Xfuture          启用最严格的检查, 预期将来的默认值
    -Xint             仅解释模式执行
    -Xinternalversion
                      显示比 -version 选项更详细的 JVM
                      版本信息
...

非稳定参数

非稳定参数通过 -XX: 开头,其和具体的jvm有关,且随时可能随时在下一个版本中删除,具体使用在如下两种形式其中一种,如下:

-XX:+-flag
    打开某布尔的开关,如-XX:+UseG1GC设置使用G1 GC。
-XX:key=value
    通过kv的形式设置值,如-XX:MaxPermSize=256m,设置方法区大小为256m

2:参数分类

按照参数设置的内容可以分为如下6类,分别看下。

2.1:系统属性参数

系统属性参数首先我们可以在操作系统级别设置,如果是windows则是在如下界面设置:

如果是Linux则可以在 /etc/profile 等文件中配置,但是这种方式配置的是全局的,对所有的进程生效,另外一种就是通过 -D:k=v 设置进程的属性,如 -Dmaven.test.skip.true , -Dfile.encoding=UTF-8 ,当然也可以通过System.setProperty来设置,如下测试:

2.2:内存大小参数

为了方便对应到具体的内存区域,我们先来看下jvm的内存结构,如下图:

先看下主要参数:

-Xms
    设置堆内存的初始大小,即最小内存
-Xmx
    设置堆的最大大小,一般-Xms和-Xmx设置为一样,这样可以避免堆内存扩容带来的性能抖动
-Xms   
    设置堆的young区的大小
-XX:MaxDirectMemorySize=size
    设置可以使用的最大堆外内存,即操作系统的内存,效果同-Dsun.nio.MaxDirectoryMemorySize=size
-Xss
    设置线程栈的大小,影响栈的深度,如-Xss1m,即设置线程栈的大小为1M,效果同-XX:ThreadStackSize=size

这些参数和jvm内存结构关系如下图:

2.3:GC相关参数

主要是设置使用何种类型的垃圾收集器,如下:

-XX:+UseG1GC 使用G1垃圾收集器
-XX:+UseConcMarkSweepGC 使用CMS垃圾收集器
-XX:+UseSerialGC 使用串行垃圾收集器
-XX:+UseParallelGC 使用并行垃圾收集器

2.4:分析诊断相关相关参数

-XX:+HeapDumpOnOutOfMemoryError 当发生OutOfMemoryError时,自动dump堆内存
    如,java -XX:+HeapDumpOnOutOfMemoryError -Xmx256m SomeJavaFile
-XX:+HeapDumpPath 与-XX:HeapDumpOnOutOfMemoryError 配合使用,设置发生了OOM后生成dump文件路径,如果是没有指定则默认为启动java程序的工作目录
    如,java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local -Xmx256m SomeJavaFile
-XX:OnOutOfMemoryError 抛出OutOfMemoryError错误时执行的脚本
-XX:ErrorFile=filename 致命错误的日志文件名称,绝对路径或者相对路径

2.5:javaagent

TODO 学习后补充!!!

到此这篇关于深入理解jvm启动参数的文章就介绍到这了,更多相关jvm启动参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot整合RabbitMQ 中的 TTL实例代码

    springboot整合RabbitMQ 中的 TTL实例代码

    TTL 是 RabbitMQ 中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒,这篇文章主要介绍了springboot整合RabbitMQ 中的 TTL,需要的朋友可以参考下
    2022-09-09
  • Java汉字转拼音工具类完整代码实例

    Java汉字转拼音工具类完整代码实例

    这篇文章主要介绍了java汉字转拼音工具类完整代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 用Rational Rose逆向工程(java)生成类图(教程和错误解决)

    用Rational Rose逆向工程(java)生成类图(教程和错误解决)

    Rational Rose有个很方便的功能,将项目中的JAVA代码自动转换成UML类图
    2013-02-02
  • 使用maven shade插件解决项目版本冲突详解

    使用maven shade插件解决项目版本冲突详解

    这篇文章主要为大家介绍了使用maven shade插件解决项目版本冲突详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Java通用Mapper UUID简单示例

    Java通用Mapper UUID简单示例

    今天小编就为大家分享一篇关于Java通用Mapper UUID简单示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解Java面向对象编程中方法的使用

    详解Java面向对象编程中方法的使用

    这篇文章主要介绍了详解Java面向对象编程中方法的使用,包括方法的重载和参数以及泛型方法等知识点,需要的朋友可以参考下
    2016-02-02
  • 简单了解JAVA内存泄漏和溢出区别及联系

    简单了解JAVA内存泄漏和溢出区别及联系

    这篇文章主要介绍了简单了解JAVA内存泄漏和溢出区别及联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java8 自定义CompletableFuture的原理解析

    Java8 自定义CompletableFuture的原理解析

    这篇文章主要介绍了Java8 自定义CompletableFuture的原理解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 解析SpringBoot中@Autowire注解的实现原理

    解析SpringBoot中@Autowire注解的实现原理

    在开发Java项目时,依赖注入是一种常见的实现方式,SpringBoot框架通过@Autowired注解来实现依赖注入的功能,本文将介绍SpringBoot中 Autowired注解实现的原理
    2023-06-06
  • java实用型-高并发下RestTemplate的正确使用说明

    java实用型-高并发下RestTemplate的正确使用说明

    这篇文章主要介绍了java实用型-高并发下RestTemplate的正确使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论