Java 支持的运行参数包括如下几种:
标准参数又分为如下几种:
JVM 工作在 Server 模式可以大大提高性能,但应用的启动会比 Client 模式慢大概10%。
当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以 Server 模式启动,否则以 Client 模式启动。
Client 模式启动速度较快,Server 模式启动较慢;但是启动进入稳定期长期运行之后 Server 模式的程序运行速度比 Client 要快很多。这是因为 Server 模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而 Client 模式启动的 JVM 采用的是轻量级的虚拟机。所以 Server 启动慢,但稳定后速度比 Client 远远要快。
在程序运行的时候究竟会有多少类被加载呢,一个简单程序会加载上百个类的!
你可以用 verbose:class 来监视,在命令行输入 java -verbose:class XXX (XXX为程序名) 你会在控制台看到加载的类的情况。
verbose 和 verbose:class 含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:
[Loaded java.io.FilePermission$1 from shared objects file]
当虚拟机报告类找不到或类冲突时可用此参数来诊断从虚拟机装入类的情况。
显式虚拟机记载的类的情况
显示虚拟机内存回收情况,在虚拟机发生内存回收时在输出设备显示内存回收信息,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
-verbose:gc // 虚拟机发生 GC 时,打印内存回收情况
Java 断言默认是不启用的。在运行时,是需要显式开启才能生效,否则断言没有任何意义。
断言可以开启局部断言,格式如下:
-ea:<classname> java -ea:MyClass1 打开 MyClass1 的 assertion
-da:<classname> java -da: MyClass1 关闭MyClass1的assertion
-ea:<packagename> java -ea:pkg1 打开pkg1包的assertion
-da:<packagename> java -da:pkg1 关闭pkg1包的assertion
-ea:... java -ea:... 打开缺省包(无名包)的assertion
-da:... java -da:... 关闭缺省包(无名包)的assertion
-ea:<packagename>... java -ea:pkg1... 打开pkg1包和其子包的assertion
-da:<packagename>... java -da:pkg1... 关闭pkg1包和其子包的assertion
-esa java -esa 打开系统类的assertion
-dsa java -dsa 关闭系统类的assertion
当开始断言后,程序中的如下代码就会生效:
assert <布尔表达式>
assert <布尔表达式> : <错误信息>
开启断言
关闭断言,也可不指定 -ea 参数(默认关闭断言)
设置 JVM 堆的最大值
-Xmx3550 // 设置 JVM 堆的最大值为 3550M
设置 JVM 堆的最小值
-Xms3550M // 设置 JVM 堆的最小值为 3550M
设置初始和最大的年轻代大小,可以指定单位k(K),m(M),g(G)。
年轻代用于存储新创建的对象,这个区域的垃圾回收的频率要比其他区域高的多。如果这个区域太小了,那么垃圾回收的次数就会太多;如果太大了,垃圾回收就会浪费很多的时间。oracle建议年轻代的大小是堆总大小的四分之一到二分之一之间。
我们还可以通过其他两个选项来代替这个选项来指定年轻代最小和最大内存:
-XX:NewSize 设置年轻代的初始内存
-XX:MaxNewSize 设置年轻代的最大内存
# 设置新生代大小为 2G
-Xmn2G
# 下面的例子展示了怎么设置年轻代的大小为256M
-Xmn256m
-Xmn262144k
-Xmn268435456
-XX:NewSize 设置年轻代的初始内存;
-XX:NewSize=512m # 设置年轻代的初始内存为 512M
-XX:MaxNewSize 设置年轻代的最大内存;
-XX:MaxNewSize=512m # 设置年轻代的最大内存为 512M
JDK1.8取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize参数失效,取而代之的是-XX:MetaspaceSize -XX:MaxMetaspaceSize
-XX:PermSize 设置老年代的初始内存
-XX:PermSize=64M # 设置老年代的初始内存为 64M
JDK1.8取消了PermGen,取而代之的是Metaspace,所以PermSize和MaxPermSize参数失效,取而代之的是-XX:MetaspaceSize -XX:MaxMetaspaceSize
-XX:MaxPermSize 设置老年代的最大内存
-XX:MaxPermSize=64M # 设置老年代的最大内存为 64M
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
ss: stack size,设置每个线程的栈大小,单位:k(K)、m(M)、g(G)。
JDK5.0 以后每个线程栈大小为 1M,之前每个线程栈大小为 256K。
在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
需要注意的是:当这个值被设置的较大时(例如 > 2MB)将会在很大程度上降低系统的性能。
这个选项和 -XX:ThreadStackSize 相同。
-Xss128k // 设置线程栈大小为128K
JAVA最多支持多少个线程
把 GC 信息输出到文件中,和 verbose:gc 的内容是一样的。
如果这两个命令一起使用的话,Xloggc 会覆盖 verbose:gc 命令。
-Xloggc:garbage-collection.log // 将 GC 信息输出到 garbage-collection.log 文件中
加载 Java 代理, 请参阅 java.lang.instrument
-javaagent:/usr/local/eclipse/lombok.jar # 加载 Java 代理 lombok.jar 包
java.lang.instrument使用
Instrumentation 新功能
技术问答集锦(13)Java Instrument原理
深入理解Instrument(一)
设置垃圾收集时间占程序运行时间的百分比,默认值为 99,就是允许最大 1/100 的垃圾收集时间。公式为1/(1+n)
-XX:GCTimeRatio=99 // 设置垃圾收集占程序总运行时间的比例为 1/100
JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.3 Parallel Scavenge 收集器
该参数主要用于 Parallel Scavenge 收集器,由于Parallel Scavenge 收集器为新生代收集器,所以该参数主要用于设置新生代垃圾收集最大暂停时间,即新生代最大垃圾收集时间不超过该值,单位为 ms
-XX:MaxGCPauseMillis=100 // 设置新生代垃圾收集最大暂停时间为 100ms
JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.3 Parallel Scavenge 收集器
对象晋升到老年代的年龄阈值
-XX:PretenureSizeThreshold=1 // 设置对象晋升到老年代的年龄阈值为 1
《深入理解Java虚拟机_第2版》3.6.3 长期存活的对象将进入老年代
设置并行GC时进行内存回收的线程数
-XX:ParallelGCThreads=8 // 设置并行GC时进行内存回收的线程数
设置对象进入老年代的大小阈值,大于这个值的对象直接在老年代分配,单位必须为字节
-XX:PretenureSizeThreshold=3145728 // 大于 3145728 的对象将直接在老年代进行分配
《深入理解Java虚拟机_第2版》3.6.2 大对象直接进入老年代
打印虚拟机内存回收日志
-XX:+PrintGCDetails // 打印虚拟机内存回收日志
新生代中 Eden 区域与 Survivor 区域的容量比值,默认为 8,代表 Eden:Survivor=8:1。
-XX:SurvivorRatio=8 // Eden 区域与 Survivor 区域的比值,Eden:Survivor=8:1
设置虚拟机使用 GC 自适应的调节策略,使用该参数之后,将不再需要设置 -Xmn、-XX:SurvivorRatio、-XX:PretenureSizeThreshold 等细节参数,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量。
-XX:UseAdaptiveSizePolicy // 设置 JVM 使用 GC 自适应的调节策略
JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.3 Parallel Scavenge 收集器
虚拟机运行在Client模式下的默认值,打开此开关后,使用 Serial + Serial Old 的收集器组合进行内存回收
跟踪显示类加载的过程
-XX:+TraceClassLoading // 跟踪显示类加载的过程
禁止调用System.gc();但jvm的gc仍然有效
最大化文件描述符的数量限制
新生代GC优先于Full GC执行
在抛出OOM之前限制jvm耗费在GC上的时间比例
对老生代采用并发标记交换算法进行GC
启用并行GC
对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
启用串行GC
启用本地线程优先级
设置用于Java堆的大页面尺寸
GC后java堆中空闲量占的最大比例
GC后java堆中空闲量占的最小比例
新生代内存容量与老生代内存容量的比例
保留代码占用的内存容量
设置线程栈大小,若为0则使用系统默认值
使用大页面内存
指定导出堆信息时的路径或文件名
当首次遭遇OOM时导出此时堆中相关信息
遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
跟踪类的加载信息
出现致命ERROR之后运行自定义命令
JVM虚拟机参数查询
java–jvm启动的参数
Java运行参数设置
JVM参数配置详解(包含JDK1.8)
《深入理解Java虚拟机_第2版》3.5.9 垃圾收集器参数总结