way-to-architect
  • 前言
  • Java
    • Java关键字
      • Java中四种修饰符的限制范围
      • static和final
    • 容器
      • 容器概述
        • 容器:综述
        • Iterator原理及实现
        • fast-fail机制
        • 比较器Comparator
        • Collections工具类
      • List
        • List综述
        • ArrayList原理分析
        • ArrayList在循环过程中删除元素的问题
        • 常用的小技巧
        • CopyOnWrite
      • Set
        • Set综述
        • HashSet
        • LinkedHashSet
        • TreeSet
      • Queue
        • Queue综述
        • ArrayBlockingQueue实现原理
        • LinkedBlockingQueue实现原理
        • 高性能无锁队列Disruptor
      • Map
        • Map综述
        • HashMap
          • HashMap实现原理
          • HashMap中的位运算
          • HashMap其他问题
        • LinkedHashMap
        • TreeMap
        • ConcurrentHashMap
          • ConcurrentHashMap实现原理JDK1.7
          • ConcurrentHashMap实现原理JDK1.8
        • ConcurrentSkipListMap
        • Map中key和value的null的问题
    • 线程
      • 线程
        • 创建线程
        • 线程状态及切换
        • 线程中断的理解
        • 几种方法的解释
        • 用户线程与守护线程
        • 线程组ThreadGroup
      • 线程池
        • 线程池工作原理及创建
        • Executor
        • 如何确保同一属性的任务被同一线程执行
      • ThreadLocal
        • ThreadLocal原理
        • ThreadLocal之父子线程传值
        • InheritableThreadLocal
      • 同步与锁
        • 线程安全与锁优化
        • synchronize关键字
        • Lock
          • 队列同步器
            • 同步状态的获取与释放
            • 使用方式
            • 示例:Mutex
            • 示例:TwinsLock
          • 重入锁和读写锁
          • LockSupport
          • Condition
          • 并发工具类
        • CAS
          • CAS的理解
          • Java中原子操作类
        • 3个经典同步问题
      • fork/join的理解
    • I/O
      • I/O概述
        • 磁盘I/O与网络I/O
        • 主要接口
        • 输入流和输出流的使用示例
        • InputStream的重复读
        • BufferdxxxxStream
        • Serailizable
        • File常用方法
        • Files和Path
        • RandomAccessFile
        • 通过零拷贝实现有效数据传输
        • 正确地处理文件
      • NIO基础
      • NIO2
      • Netty
        • Java I/O的演进之路
        • 为什么是Netty
        • 更多
      • I/O调优
    • 异常
      • 异常体系及为什么要有这种异常设计
      • 多catch的执行情况
      • try catch finally 与reture
      • 异常处理的误区
      • Preconditions:方法入参校验工具
    • 枚举
      • 常见用法
      • 枚举类在序列化中的问题
    • 注解
      • 概述
      • Spring中的组合注解的条件注解
      • 常用注解
        • JSR-330标准注解
    • 反射
      • 概述
      • 内部类的反射
      • 反射中需要注意的地方
    • 流程控制
      • switch case without break
      • Java: for(;;) vs. while(true)
    • JVM
      • JVM内存结构
      • Java内存模型
      • 垃圾收集器和内存分配策略
      • 四种引用类型区别及何时回收
      • 类文件结构
      • 类初始化顺序
      • 类加载机制
      • 虚拟机执行引擎
      • 逃逸分析
      • JVM常用配置
      • GC日志分析
      • Java8 JVM 参数解读
      • 垃圾收集器和内存分配策略
    • 面向对象
      • Object类中的方法
      • Class类中的方法
      • 值传递还是引用传递?
      • 接口和抽象类的区别
      • 深拷贝和浅拷贝
      • Integer.parseInt()与Interger.valueof()
      • hashCode()与equal()
      • String
        • String池化及intern()方法的作用
        • 关于字符串
    • 序列化
      • Java序列化的方式有哪些?
    • 新特性
      • 流 Stream
        • Stream是什么
        • Stream API详解
        • Stream进阶
        • 流编程
        • 其他事项
      • lambda表达式
      • 默认方法(Default Methods)
      • @FunctionalInterface注解
    • SPI
      • 理解SPI
    • 字节码
      • javaagent
      • 字节码操纵
      • 如何查看类编译后的字节码指令
      • 字节码指令有哪些
  • Python
    • 异常处理
  • Go
  • 数据结构与算法
    • 数据结构
      • 概述
        • 线性表
        • 栈
        • 队列
        • 串
        • 树
        • 图
      • Java的一些实现
      • 红黑树
      • 双缓冲队列
      • 跳表SkipList
    • 算法
      • 概述
      • 常见算法
        • 基本排序
        • 高级排序
        • 动态规划
  • 框架或工具
    • Spring
      • Spring基础
        • Spring整体架构
        • 什么是IoC
        • Ioc容器的基本实现
        • Spring的MainClass
          • Spring的BeanFactory
          • Spring的Register
          • Spring的Resource和ResourceLoader
          • Spring的PropertySource
          • Spring的PropertyResolver
          • Spring的PropertyEditor
          • Spring的Convert
          • Spring的BeanDefinition
          • Spring的BeanDefinitionReader
          • Spring的BeanDefiniton其他Reader
          • Spring的BeanDefinition其他Reader2
          • Spring的Aware
          • Spring的BeanFctoryPostProcessor
          • Spring的BeanPostProcessor
          • Spring的Listener
        • Xml格式的应用启动
          • Xml格式的应用启动2
          • Xml格式的应用启动3
          • Xml格式的应用启动4
          • Xml格式的应用启动5
          • Xml格式的应用启动6
          • Xml格式的应用启动7
        • Spring中的设计模式
        • 什么是AOP
        • Spring中AOP的实现
      • Spring应用
        • Spring的事务控制
        • @Transactional注解在什么情况下会失效
        • 如何在数据库事务提交成功后进行异步操作
        • Spring中定时任务的原理
    • SpringMVC
      • Controller是如何将参数和前端传来的数据一一对应的
      • 请求处理流程
    • Zookeeper
      • Zookeeper是什么
      • Zookeeper能干啥
    • Shiro
    • druid
    • Netty
    • Consul
      • Consul是什么
    • etcd
    • confd
    • Akka
      • Actor模型是什么
  • 数据库
    • 基本概念
    • MySQL
      • 基本配置
      • MySQL数据类型
      • MySQL存储引擎
      • MySQL事务
        • MySQL事务概念
      • MySQL索引
        • MySQL中的索引类型
        • B-Tree/B+Tree概述
        • 为什么使用B+Tree
        • MySQL中的B+Tree索引
        • MySQL高性能索引策略
      • MySQL查询
        • MySQL查询过程
        • MySQL查询性能优化
        • 使用EXPLAIN
      • MySQL锁
        • MySQL中锁概述
        • InnoDB的并发控制
        • MySQL乐观锁
      • MySQL分库分表
        • 分库/分表
        • 跨库JOIN
        • 跨库分页
        • 分库分表后的平滑扩容
        • 分区表
        • 分布式ID生成方法
      • MySQL实战
        • 在线表结构变更
        • MySQL优化规则
        • MySQL问题排查
        • 常见查询场景
    • Redis
    • Hbase
    • OpenTSDB
    • rrd
    • MongoDB
    • 连接池
  • 系统设计
    • 一致性Hash算法
    • 限流
      • 限流是什么
      • 限流算法
      • 应用内限流
      • 分布式限流
      • 接入层限流
        • ngx_http_limit_conn_module
        • ngx_http_limit_req_module
        • lua_resty_limit-tarffic
      • 节流
    • 降级
      • 降级详解
      • 人工降级开关的实现
      • 自动降级的实现:Hystrix
    • 负载均衡
      • 概述
      • 互联网架构下的负载均衡
      • Nginx负载均衡(七层)
      • Nginx负载均衡(四层)
      • Nginx动态配置
    • 超时与重试机制
      • 什么地方要超时与重试
      • 代理层超时与重试
      • Web容器超时
      • 中间件客户端超时与重试
      • 数据库超时
      • NoSQL客户端超时设置
      • 业务超时
      • 前端请求超时
    • 网关
    • CAP
      • 什么是CAP
      • CAP理解
    • 生产者-消费者模型
      • 使用notify/wait方式
      • 使用await/signal实现
      • 使用阻塞队列实现
      • 使用信号量实现
      • 使用管道流实现
      • 无锁队列Disruptor
      • 双缓冲队列
    • 缓存
      • 缓存概述
      • 数据库缓存
      • 应用缓存
      • 前端缓存
      • 本地缓存
    • 秒杀
    • LRU
  • 版本控制
    • Git
      • Git常用命令
      • 场景命令
    • Svn
  • 计算机操作系统
    • Linux
      • Linux中重要概念
      • 常用命令
      • 查看日志
      • 权限管理
      • 登录或传输
      • 防火墙
      • 配置ssh免密
      • 进程
      • 防火墙
    • Mac
    • 计算机基础
      • 进制
      • Java中的位运算
      • 计算机存储系统结构
  • 网络
    • TCP三次握手和四次挥手
    • 网络术语
      • 网关、路由器、交换机、IP等
      • VLAN
      • LAN
  • 设计模式
    • 设计模式概述
    • 创建型
      • 单例模式
      • 工厂模式
      • 建造者模式
      • 原型模式
      • 享元模式
    • 行为型
      • 观察者模式
      • 策略模式
      • 模板模式
      • 责任链模式
      • 命令模式
      • 外观模式
      • 迭代器模式
      • 中介者模式
        • 中介模式续
      • 状态模式
        • 状态模式实例
        • 状态模式思考
      • 访问者模式
        • 访问者实例1
        • 访问者模式续
    • 结构型
      • 组合模式
        • 组合模式续
      • 装饰模式
        • 装饰模式续
      • 代理模式
      • 备忘录模式
      • 桥接模式
        • 桥接模式实例一
  • 构建工具
    • Maven
      • 常用命令
      • Maven生命周期
      • Maven中的变量和属性
      • 不同环境的如何配置不同的变量
      • 常用插件及配置
      • 其他问题
      • dependencies与dependencyManagement的区别
    • Gradle
  • 大数据
    • Hadoop
    • Storm
    • Spark
  • 服务器
    • Tomcat
      • server.xml配置详解
      • 线程池和连接数配置
      • Maven远程部署
      • 一些小技巧
      • Tomcat类加载机制分析
      • Tomcat的日志
      • Tomcat架构
        • 概述
        • Server 的启动流程
        • 请求处理流程
    • Nginx
      • 常用命令
      • 基本配置
      • Lua
    • Tengine
  • 中间件
    • 任务调度
      • 为什么需要任务调度
    • 消息队列
      • 为什么需要消息队列
      • 消息队列关键点
      • 消息中间件需要解决的问题
      • 不同消息队列产品对比
      • RocketMQ
        • 快速入门
        • 整体架构
        • 部署方式
          • Broker部署方案
        • 客户端使用
          • 客户端使用指南
          • 快速开始
          • 简单示例
          • 有序消息示例
          • 广播消息示例
          • 定时消息示例
          • 批量消息示例
          • 过滤消息示例
          • 日志输出配置示例
        • 关键点实现
          • 顺序消息的实现
        • 最佳实践
          • Broker的最佳实践
          • 生产者最佳实践
            • 生产者最佳实践续
          • 消费者最佳实践
            • 消费者最佳实践续
          • 名称服务最佳实践
          • JVM/kernel配置的最佳实践
          • 新特性 Filter Server
          • 其他事项
      • RabbitMQ
      • Kafka
    • 分布式事务
      • 什么是分布式事务
      • 解决方案
    • 服务治理
      • RPC概念
      • RPC最简实现
      • 为什么需要服务治理
      • Dubbo
        • Dubbo整体架构
      • Java RMI
    • 分布式锁
      • 如何设计分布式锁
        • 基于zookeeper
        • 基于Redis
    • 注册中心
      • 注册中心的职责
      • 不同注册中心的比较
    • 配置中心
      • 概述
      • 配置中心的实现与选型
  • Web开发
    • Http请求类型及区别
    • 常见的content-type
    • 如何处理跨域
    • Restful最佳实践
    • HTTP状态码
    • Http下载原理
  • 测试
    • 压测:apache bench
    • 压测:Jmeter
Powered by GitBook
On this page
  • 命令参数包含
  • 标准参数(Standard Option)
  • 非标准参数(Non-Standard Options)
  • 高级运行时参数(Advanced Runtime Options)
  • 高级JIT编译器参数(Advanced JIT Compiler Options)
  • 高级服务能力参数(Advanced Serviceability Options)
  • 高级垃圾回收参数(Advanced Garbage Collection Options)
  1. Java
  2. JVM

Java8 JVM 参数解读

PreviousGC日志分析Next垃圾收集器和内存分配策略

Last updated 7 years ago

java命令的通用形式如下:

java [options] classname [args]
java [options] -jar filename [args]

这里所说的命令参数就是options中的内容。这些options通过命令行传递给JVM,使每个JVM实例都会有自己的运行特性。每通过java命令启动一个java程序,都会创建一个JVM实例。

命令参数包含

  • 标准参数(Standard Option)

  • 非标准参数(Non-Standard Options)

  • 高级运行时参数(Advanced Runtime Options)

  • 高级JIT编译器参数(Advanced JIT Compiler Options)

  • 高级服务能力参数(Advanced Serviceability Options)

  • 高级垃圾回收参数(Advanced Garbage Collection Options)

标准参数(Standard Option)

标准参数是被所有JVM实现都要支持的参数。用于做一些常规的通用的动作,比如检查版本、设置classpath等。

-agentlib:libname[=options] 这个命令加载指定的native agent库。理论上这条option出现后,JVM会到本地固定路径下LD_LIBRARY_PATH这里加载名字为libxxx.so的库。而这样的库理论上是JVM TI的功能,具体可以参考

-agentpath:pathname[=options] 这个参数指定了从哪个绝对路径加载agent库。与-agentlib相同,只不过是用绝对路径来指明库文件。

-client -server 指定JVM的启动模式是client模式还是server模式,具体就是 Java HotSpot Client(Server) VM 版本。目前64位的JDK启动,一定是server模式,会忽略这个参数。

-d32 和 -d64 这个参数指定JVM启动的环境模式,默认是32位启动,如果系统不支持,那么会报错,-d64模式和-server模式是绑定的,也就是说-d64声明了就默认是server模式。

-Dproperty=value 这个参数是最常见的了,就是设置系统属性,设置后的属性可以在代码中System.getProperty方法获取到。

disableassertions[:[packagename]...|:classname] -da[:[packagename]...|:classname] 关闭指定包或类下的assertion,默认是关闭的。

-disablesystemassertions -dsa 关闭系统包类下的assertion。

-enableassertions[:[packagename]...|:classname] -ea[:[packagename]...|:classname] 同上,开启指定包类下的assertion。

-enablesystemassertions -esa 同上,开启系统包类下的assertion。

-javaagent:jarpath[=options] 加载指定的java agent,具体需要传入jar路径。

-verbose:class -verbose:gc -verbose:jni 这些组合都是用来展示信息的,class展示的每个class的信息,gc展示每个GC事件的信息,jni开启展示JNI调用信息。

-version 显示版本信息,然后退出

非标准参数(Non-Standard Options)

这里的非标准参数主要是针对官方JVM也就是HotSpot的,当然各家自研的JVM也有自己的非标准参数。

-X 著名的-X参数,就是一个help,展示所有-X开头的参数说明。

-Xbatch 禁止后台编译。将编译过程放到前台任务执行。JVM默认会将编译任务当做后台任务执行。这个参数等价于-XX:-BackgroundCompilation

-Xfuture 强制class文件格式检查。

-Xint 在 interpreted-only模式运行程序。编译为native的模式不再生效,所有的字节码都在解释器环境下解释执行。

-Xinternalversion 打印一个更详细的java版本信息,执行后退出。

-Xloggc:filename 设置gc日志文件,gc相关信息会重定向到该文件。这个配置如果和-verbose:gc同时出现,会覆盖-verbose:gc参数。

比如-Xloggc:/home/admin/logs/gc.log

-Xmaxjitcodesize=size 为JIT编译的代码设置最大的code cache。默认的设置是240m,如果关闭了tiered compilation,那么默认大小是48m。这个参数和-XX:ReservedCodeCacheSize是等价的。

-Xmixed 用解释器执行所有的字节码,除了被编译为native code的hot method。

-Xmnsize 设置初始最大的年轻代堆大小。

比如-Xmn256m

-Xmssize 设置初始的堆大小。

-Xmxsize 设置最大的内存分配大小。一般的服务端部署,-Xms和-Xmx设置为同样大小。与-XX:MaxHeapSize具有同样的作用。具体设置参考[3]

-Xnoclassgc 关闭对class的GC。这样设置可以节约一点GC的时间,不过带来的影响就是class永驻内存,不当的使用会导致OOM风险。

-XshowSettings:category 查看settings信息,category可以是all、locale、properties和vm几部分。

-Xsssize 设置thread stack大小,一般默认的几个系统参数如下:

Linux/ARM (32-bit): 320 KB

Linux/i386 (32-bit): 320 KB

Linux/x64 (64-bit): 1024 KB

OS X (64-bit): 1024 KB

Oracle Solaris/i386 (32-bit): 320 KB

Oracle Solaris/x64 (64-bit): 1024 KB

-Xverify:mode 设置字节码校验器的模式,默认是remote,即只校验那些不是通过bootstrap类加载器加载的字节码。而还有一个模式还all,即全部都校验。虽然还有一个模式是none,但是本质上jvm不生效这个参数。因为字节码校验是非常重要的,如果关闭,将可能导致class文件格式就是错的,这对于系统稳定和安全来说有重大风险。

高级运行时参数(Advanced Runtime Options)

这类参数控制Java HotSpot VM在运行时的行为。

-XX:+DisableAttachMechanism 设置JVM的attach模式,如果启动了这个参数,jvm将不允许attach,这样类似jmap等程序就无法使用了。

-XX:ErrorFile=filename 当不可恢复的错误发生时,错误信息记录到哪个文件。默认是在当前目录的一个叫做hs_err_pid pid.log的文件。如果指定的目录没有写权限,这时候文件会创建到/tmp目录下。使用如下:

-XX:ErrorFile=/var/log/java/java_error.log

-XX:MaxDirectMemorySize=size 为NIO的direct-buffer分配时指定最大的内存大小。默认是0,意思是JVM自动选择direct-buffer的大小。使用如下:

-XX:MaxDirectMemorySize=1m

-XX:ObjectAlignmentInBytes=alignment java对象的内存对齐大小。默认是8字节,JVM实际计算堆内存上限的方法是

4GB * ObjectAlignmentInBytes

-XX:OnError=string 在jvm出现错误(不可恢复)的时候,执行哪些命令。具体例子如下:

-XX:OnError="gcore %p;dbx - %p"

-XX:OnOutOfMemoryError=string 同上,具体错误是OOM。

-XX:-UseCompressedOops 禁止使用压缩命令来压缩指针引用。压缩指针是默认开启的,如果使用压缩命令压缩指针,可以在JVM内存小于32G时做到内存压缩,即在64位机器上做到内存指针对齐只占用32位而不是64位。这样对于小于32G的JVM有非常高的性能提升。该参数只在64位JVM有效。

-XX:+UseLargePages 使用大页内存[4],默认关闭,使用该参数后开启。

高级JIT编译器参数(Advanced JIT Compiler Options)

这部分的参数主要在动态just in time编译时用到。

-XX:+BackgroundCompilation 后台编译,默认是开启的,如果要关闭,使用-XX:-BackgroundCompilation或者-Xbatch。

-XX:CICompilerCount=threads 编译时的编译器线程数。server版的JVM默认设置为2,client版本默认设置为1。如果tiered编译开启,则会伸缩到核数个线程。

XX:CodeCacheMinimumFreeSpace=size 编译使用的最小空闲空间。默认是500KB,如果最小空闲空间不足,则编译会停止。

-XX:CompileThreshold=invocations 编译前解释型方法调用次数。设置这个值,在编译前,会用解释器执行方法若干次用于收集信息,从而可以更高效率的进行编译。默认这个值在JIT中是10000次。可以通过使用-Xcomp参数来禁止编译时的解释执行。

-XX:+DoEscapeAnalysis 支持转义分析,默认是开启的。

-XX:InitialCodeCacheSize=size 初始化的code cache的大小,默认500KB。这个值应该不小于系统最小内存页的大小。

-XX:+Inline 编译时方法内联。默认是开启的。

-XX:InlineSmallCode=size 设置最大内联方法的代码长度,默认是1000字节,只有小于这个设置的方法才会被编译内联。

-XX:+LogCompilation 编译时日志输出,在编译时会有一个hotspot.log的日志输出到当前工作目录下。可以用-XX:LogFile指定不同的目录。默认这个参数是关闭的,即编译日志不输出。这个参数需要和-XX:UnlockDiagnosticVMOptions一起使用。也可以使用-XX:+PrintCompilation选项在控制台打印编译过程信息。

-XX:MaxInlineSize=size 编译内联的方法的最大byte code大小。默认是35,高于35个字节的字节码不会被内联。

-XX:+OptimizeStringConcat 字符串concat优化。默认开启。

-XX:+PrintAssembly 通过使用外部的disassembler.so库打印汇编的字节码和native方法来辅助分析。默认是不开启的,需要和-XX:UnlockDiagnosticVMOptions一起使用。

-XX:+PrintCompilation 将方法编译过程打印到控制台。默认不开启。

-XX:+PrintInlining 将内联方法打印出来。默认不开启。

-XX:ReservedCodeCacheSize=size 设置为了JIT编译代码的最大代码cache大小。这个设置默认是240MB,如果关掉了tiered编译,则大小是48MB。这个设置必须比初始化的-XX:InitialCodeCacheSize=size设置值大。

-XX:-TieredCompilation 关闭tiered编译,默认是开启的。只有Hotspot支持这个参数。

-XX:+UseCodeCacheFlushing 支持在关闭编译器之前清除code cache。默认是开启的,要关闭就把+换成-。

高级服务能力参数(Advanced Serviceability Options)

这部分参数可以做系统信息收集和扩展性的debug。

-XX:+ExtendedDTraceProbes 支持dtrace探测,默认是关闭的。

-XX:+HeapDumpOnOutOfMemory 设置当java.lang.OutOfMemoryError发生时,将heap内存dump到当前目录的一个文件。默认是不开启的。

-XX:HeapDumpPath=path 设置在dump heap时将文件dump到哪里。默认是当前目录下 java_pidpid.hprof这样形式的文件。指定文件时例子如下:

-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof

-XX:LogFile=path 指定日志数据被记录在哪里,默认是在当前目录的hotspot.log下。设置例子如下:

-XX:LogFile=/var/log/java/hotspot.log

-XX:+PrintClassHistogram 支持打印类实例的直方图,在按下ctrl+c时(SIGTERM)触发。默认是关闭的。等价于运行jmap -histo命令或者jcmd pid GC.class_histogram命令。

-XX:+PrintConcurrentLocks 支持打印java.util.concurrent的锁信息,在SIGTERM时触发。默认关闭,等价于运行jstack -l或者jcmd pid Thread.print -l命令。

-XX:+UnlockDiagnosticVMOptions 解锁对JVM进行诊断的选项参数。默认是关闭的,开启后支持一些特定参数对JVM进行诊断。

高级垃圾回收参数(Advanced Garbage Collection Options)

这部分参数控制JVM如何进行垃圾回收(GC)

-XX:+AggressiveHeap java堆内存优化。默认是关闭的,如果开启后,针对一些长时间运行的且有密集的内存分配操作,JVM根据系统cpu和内存的配置参数来进行优化。

-XX:+AlwaysPreTouch 支持在JVM启动时touch每一页,这样做会导致每页都会进入内存。可以用来模拟测试长时间运行的任务,将虚拟内存全部映射到物理内存。默认是关闭的。

-XX:+CMSClassUnloadingEnabled 支持CMS垃圾回收下的类卸载。默认是开启的。

-XX:CMSExpAvgFactor=percent 设置一个时间百分比,用来加权并发回收统计的指数平均的样本。默认是25%。

-XX:CMSInitiatingOccupancyFraction=percent 设置一个年老代的占比,达到多少会触发CMS回收。默认是-1,任何一个负值的设定都表示了用-XX:CMSTriggerRatio来做真实的初始化值。设置方法如下:

-XX:CMSInitiatingOccupancyFraction=20

-XX:+CMSScavengeBeforeRemark 开启功能在CMSremark前进行Scavenge。默认是关闭的。

-XX:CMSTriggerRatio=percent 设置一个在CMS开始前的内存的触发百分比,针对的是由-XX:MinHeapFreeRatio分配的内存。默认是80。

-XX:ConcGCThreads=threads 设置支持并发GC的线程数。默认值依赖于给JVM的CPU数目。设置方法如:

-XX:ConcGCThreads=2

-XX:+DisableExplicitGC 关闭显式GC调用,即关闭System.gc()。默认是可以调用的。

-XX:+ExplicitGCInvokesConcurrent 支持通过System.gc()来做并发的GC。默认是不支持的。该参数一定要和-XX:+UseConcMarkSweepGC一起使用。

-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 支持通过System.gc()来做并发的GC并且卸载类。默认是不支持的。该参数一定要和-XX:+UseConcMarkSweepGC一起使用。

-XX:G1HeapRegionSize=size 设置在使用G1收集器时Java堆被划分为子区域的大小。在1MB到32MB之间,默认会根据Java堆的大小自动检测。

-XX:+G1PrintHeapRegions 打印出哪些region是被分配的,哪些是被G1取回的。默认是关闭打印的。

-XX:G1ReservePercent=percent 设置一个堆内存的百分比用来作为false ceiling,从而降低使用G1时晋升失败的可能性。默认是10%。

-XX:InitialHeapSize=size 设置初始堆内存大小,需要设置为0或者1024的倍数,设置为0说明初始堆大小等于年轻代加年老代的大小。

-XX:InitialSurvivorRatio=ratio 设置初始的survivor空间占比,当使用throughput型的GC时有效(即-XX:+UseParallelGC 或 -XX:+UseParallelOldGC)。运行过程中survivor空间占比会自动根据应用运行调整,如果关闭了自适应调整策略(-XX:-UseAdaptiveSizePolicy),则XX:SurvivorRatio参数会成为survivor空间占比。计算survivor空间大小,依赖young的空间大小,计算公式如下

S=Y/(R+2)

其中Y是young空间大小,R是survivor空间占比。一个例子就是如果young空间大小是2MB,而survivor默认占比是8,那么survivor的空间就是0.2MB。

-XX:InitiatingHeapOccupancyPercent=percent 设置一个触发并发GC的堆占用百分比。这个值对于基于整体内存的垃圾回收器有效,比如G1。默认是45%,如果设置为0表示无停顿GC。

-XX:MaxGCPauseMillis=time 设置一个最大的GC停顿时间(毫秒),这是个软目标,JVM会尽最大努力去实现它,默认没有最大值设置。

-XX:MaxHeapSize=size 设置最大堆大小,这个值需要大于2MB,且是1024的整数倍。等价于-Xmx

-XX:MaxHeapFreeRatio=percent 设置在一次GC后最大的堆空闲空间占比。如果空闲堆空间超过这个值,堆空间会被收缩。默认是70%。

-XX:MaxMetaspaceSize=size 为类的元数据进行分配的metaspace最大native内存大小,默认情况这个值无限制。该值依赖于当前的JVM、其他在运行的JVM和系统可用内存。

-XX:MaxNewSize=size 设置最大的年轻代的堆大小。默认自动检测。

-XX:MaxTenuringThreshold=threshold 设置在自适应GC大小的使用占有最大阈值,默认对于parallel(throughput)的是15,对于CMS的是6。

-XX:MetaspaceSize=size 设置一个metaspace的大小,第一次超出该分配后会触发GC。默认值依赖于平台,该值会在运行时增加或减少。

-XX:MinHeapFreeRatio=percent 设置在一次GC后最小的空闲堆内存占比。如果空闲堆内存小于该值,则堆内存扩展。默认是40%。

-XX:NewRatio=ratio 设置年轻代和年老代的比例,默认是2。

-XX:NewSize=size 设置初始的年轻代的大小。年轻代是分配新对象的地方,是 GC经常发生的地方。设置太低,会频繁minor GC,设置太高的话就只会发生Full GC了。Oracle推荐设置为整体内存的一半或者1/4。该参数等价于-Xmn。

-XX:ParallelGCThreads=threads 并行GC时的线程数。默认值是CPU数。

-XX:+ParallelRefProcEnabled 支持并发引用处理,默认是关闭的。

-XX:+PrintAdaptiveSizePolicy 打印自适应调整策略。默认关闭。

-XX:+PrintGC 打印每次GC的消息,默认是关闭的。

-XX:+PrintGCApplicationConcurrentTime 打印上次GC暂停到目前的时间。默认不打印。

-XX:+PrintGCApplicationStoppedTime 打印GC暂停的时间长度。默认不打印。

-XX:+PrintGCDateStamps 打印每个GC的日期时间戳。默认不打印。

-XX:+PrintGCDetails 打印每次GC的细节信息。默认不打印。

-XX:+PrintGCTaskTimeStamps 打印每个独立的GC线程任务的时间戳。默认不打印。

-XX:+PrintGCTimeStamps 打印每次GC的时间戳。默认不打印。

-XX:+PrintStringDeduplicationStatistics 打印细节的deduplication信息。默认不打印。

-XX:+PrintTenuringDistribution 打印所在的年龄代的信息。具体例子如下:

Desired survivor size 48286924 bytes, new threshold 10 (max 10) - age 1: 28992024 bytes, 28992024 total - age 2: 1366864 bytes, 30358888 total - age 3: 1425912 bytes, 31784800 total ...

其中age1是最年轻的survivor,age2存活了2代,以此类推。默认该项关闭。

-XX:+ScavengeBeforeFullGC 在每次Full GC前做一次年轻代的GC。该项默认是开启的。

-XX:SoftRefLRUPolicyMSPerMB=time 设置一个软引用对象在上次被引用后在堆内存中保存的时间。默认是每1MB保存1秒钟。该参数对于client模式和server模式有不同的动作,因为client模式JVM在回收时会强制flush掉软引用,然而server模式会尝试先扩容堆空间。

-XX:StringDeduplicationAgeThreshold=threshold string对象到达特定的age后会去除重复数据。默认是3,jvm中每次gc后存活的对象,age会加一。string对象在晋升为年老代之前都是去除重复数据的候选对象。

-XX:SurvivorRatio=ratio eden区和survivor区的比例。默认是8。

-XX:TargetSurvivorRatio=percent 设置在YGC后的期望的survivor空间占比。默认是50%。

-XX:TLABSize=size 设置thread-local allocation buffer (TLAB)的初始化大小。

-XX:+UseAdaptiveSizePolicy 使用自适应分代大小。默认是开启的。

-XX:+UseCMSInitiatingOccupancyOnly 设置使用占用值作为初始化CMS收集器的唯一条件。默认是不开启。

-XX:+UseConcMarkSweepGC 设置让CMS也支持老年代的回收。默认是不开启的,如果开启,那么-XX:+UseParNewGC也会自动被设置。Java 8 不支持-XX:+UseConcMarkSweepGC -XX:-UseParNewGC这种组合。

-XX:+UseG1GC 设置使用G1作为GC收集器。G1比较推荐在大堆应用场景下使用(大于6GB)。

-XX:+UseGCOverheadLimit 设置一种策略用来设置一个时间比率来限制在OOM之前的GC时间。默认是开启的,并行GC时如果有多于98%以上的时间用来gc就会抛出OOM。当堆空间较小时这个参数有助于保护应用程序不至于长时间的停顿没有进展。

-XX:+UseNUMA 使用NUMA[5]开启性能优化。默认不开启,该项只有在开启了-XX:+UseParallelGC后才有效。

-XX:+UseParallelGC 支持并行的垃圾收集器,即throughput垃圾收集。这可以在多核处理器下提升垃圾收集性能。默认不开启,收集器由系统根据JVM和机器配置自动选择。开启后-XX:+UseParallelOldGC选项也自动开启。

-XX:+UseParallelOldGC 支持FULL GC的并行收集器。默认不开启。

-XX:+UseParNewGC 支持在年轻代用多线程进行垃圾收集。默认不开启,使用-XX:+UseConcMarkSweepGC时会自动被开启。

-XX:+UseSerialGC 支持使用串行收集器。默认不开启。

-XX:+UseSHM 在Linux环境下支持JVM使用共享内存来设置大页。

-XX:+UseStringDeduplication 支持string的去重存储。默认关闭,要使用该选项,必须使用G1垃圾回收器-XX:+UseG1GC。

-XX:+UseTLAB 在年轻代支持thread-local分配block,默认开启。

内容完全复制自:

JVM TI规范
Java8 JVM参数解读