JVM调优--01---JVM常用命令行参数

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优--01---JVM常用命令行参数相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


JVM常用参数

常用参数

-Xms

  • JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同值,避免每次垃圾回收完成后JVM重新分配内存;开发测试机JVM可以保留默认值。(例如:-Xms4g)

-Xmx

  • JVM可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列。最佳设值应该视物理内存大小及计算机内其他内存开销而定。(例如:-Xmx4g)

-Xmn

  • Java Heap Young区大小。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小(方法区)(相对于HotSpot 类型的虚拟机来说)。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。(例如:-Xmn2g)

  • 程序新创建的对象都是从年轻代分配内存,年轻代由Eden Space和两块相同大小的SurvivorSpace(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定年轻代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及SurvivorSpace的大小。

  • 老年代用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。2、大的数组对象,且数组中无引用外部对象。老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

-Xss

  • Java每个线程的Stack大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。(例如:-Xss1024K)

-XX:PermSize

  • 永久代(方法区)的初始内存大小。(例如:-XX:PermSize=64m)

-XX:MaxPermSize

  • 元空间(方法区)的最大内存大小。(例如:-XX:MaxPermSize=512m)

-XX:+UseSerialGC

  • 串行(SerialGC)是jvm的默认GC方式,一般适用于小型应用和单处理器,算法比较简单,GC效率也较高,但可能会给应用带来停顿。

-XX:+UseParallelGC

  • 并行(ParallelGC)是指多个线程并行执行GC,一般适用于多处理器系统中,可以提高GC的效率,但算法复杂,系统消耗较大。(配合使用:-XX:ParallelGCThreads=8,并行收集器的线程数,此值最好配置与处理器数目相等)

-XX:+UseParNewGC

  • 设置年轻代为并行收集,JKD5.0以上,JVM会根据系统配置自行设置,所以无需设置此值。

-XX:+UseParallelOldGC

  • 设置年老代为并行收集,JKD6.0出现的参数选项。

-XX:+UseConcMarkSweepGC

  • 并发(ConcMarkSweepGC)是指GC运行时,对应用程序运行几乎没有影响(也会造成停顿,不过很小而已),GC和app两者的线程在并发执行,这样可以最大限度不影响app的运行。

-XX:+UseCMSCompactAtFullCollection

  • 在Full GC的时候,对老年代进行压缩整理。因为CMS是不会移动内存的,因此非常容易产生内存碎片。因此增加这个参数就可以在FullGC后对内存进行压缩整理,消除内存碎片。当然这个操作也有一定缺点,就是会增加CPU开销与GC时间,所以可以通过-XX:CMSFullGCsBeforeCompaction=3 这个参数来控制多少次Full GC以后进行一次碎片整理。

-XX:+CMSInitiatingOccupancyFraction=80

  • 代表老年代使用空间达到80%后,就进行Full GC。CMS收集器在进行垃圾收集时,和应用程序一起工作,所以,不能等到老年代几乎完全被填满了再进行收集,这样会影响并发的应用线程的空间使用,从而再次触发不必要的Full GC。

-XX:+MaxTenuringThreshold=10

  • 垃圾的最大年龄,代表对象在Survivor区经过10次复制以后才进入老年代。如果设置为0,则年轻代对象不经过Survivor区,直接进入老年代。

JVM启动参数共分为三类

  1. 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容。例如:-verbose:class(输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断);-verbose:gc(输出每次GC的相关情况);-verbose:jni(输出native方法调用的相关情况,一般用于诊断jni调用错误信息)。

  2. 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容。例如:-Xms512m;-Xmx512m;-Xmn200m;-Xss128k;-Xloggc:file(与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。若与verbose命令同时出现在命令行中,则以-Xloggc为准)。

  3. 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用。例如:-XX:PermSize=64m;-XX:MaxPermSize=512m。

JVM参数的含义实例

并行收集器相关参数:

CMS相关参数:

辅助信息:

查看JVM进程

  1. jps命令 用于查询正在运行的JVM进程
  2. jstat可以实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据
    /home/tools/jdk1.8.0_181/bin/jstat -gcutil 30386(java进程号) 2000
  3. jinfo用于查询当前运行这的JVM属性和参数的值
[java@xftest0 ~]$ jinfo 43934

Attaching to process ID 43934, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.45-b01
Java System Properties:
 
java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = /usr/java/jdk1.6.0_45/jre/lib/amd64
java.vm.version = 20.45-b01
java.vm.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
path.separator = :
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
env = dev
user.country = US
sun.os.patch.level = unknown
  1. jmap用于显示当前Java堆和永久代的详细信息
    命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件,生成dump的命令为:jmap -dump:live,format=b,file=文文件名(hprof后缀) 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
  2. jstack用于生成当前JVM的所有线程快照,线程快照是虚拟机每一条线程正在执行的方法,目的是定位线程出现长时间停顿的原因。
  3. top命令 通过top -Hp 23344可以查看该进程下各个线程的cpu使用情况;
  4. pidstat实时查看一个进程的CPU使用情况及上下文切换情况
  5. vmstat查看总体的CPU使用情况
  6. jmap -heap 29544 查看某一实例jvm配置

GC常用参数

Parallel常用参数

CMS常用参数

G1常用参数

GC 日志分析

通过阅读 GC 日志,我们可以了解 Java 虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表

-XX:+PrintGC 输出 GC 日志。类似:-verbose:gc
-XX:+PrintGCDetails 输出 GC 的详细日志
-XX:+PrintGCTimestamps 输出 GC 的时间戳(以基准时间的形式)
-XX:+PrintGCDatestamps 输出 GC 的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC在进行 GC 的前后打印出堆的信息
-Xloggc:…/logs/gc.log日志文件的输出路径



把 GC 日志保存到文件

-Xloggc:/path/to/gc.log






heap dump部分:

  • eden space 5632K, 94% used [0x00000000ff980000,0x00000000ffeb3e28,0x00000000fff00000)

  • 后面的内存地址指的是,起始地址,使用空间结束地址,整体空间结束地址

以上是关于JVM调优--01---JVM常用命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

高并发编程系列:JVM性能调优的6大步骤,及关键调优参数详解

JVM监控和调优常用命令工具总结

JVM调优常用指令之jinfo

JVM 监控,调优,调试

JVM核心参数配置常用调试命令工具与调优思路

# JVM 参数及调优