天天看点

【JVM】jvm参数分析

一、常用参数

-Xms:初始堆。默认是物理内存的1/64(<1gb) 。默认(MinHeapFreeRatio参数可以调整)空余堆小于40%事,JVM就会增大堆直到-Xmx的最大限制.

-Xmx:最大堆。默认值是物理内存的1/4(<1gb)。默认(MaxHeapFreeRatio参数可调整)空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制.

-Xmn:年轻代大小。 此处的大小是(eden + 2 survivor space).与jmap -heap中显示的New gen是不同的。

整个堆大小=年轻代+年老代大小+持久代大小。

持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

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

-XX:PremSize:持久代(方法区)的初始内存大小(-XX:PremSize=64m.  物理内存的1/64)(Java 8就没了被-XX:MatespaceSize替代啦)

-XX:MaxPremSize:持久代(方法区)的最大内存大小(-XX:MaxPremSize=512. 物理内存的1/4)(Java 8就没了)

-XX:NewSize:年轻代大小

-XX:MaxNewSize:年轻代最大值

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

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

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

-XX:+UseParalllelOldGC:设置年老代为并行收集,JDK6.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区,直接进入老年代。

-XX:MetaspaceSize:元空间的初始大小是21M,如果启动后GC过于频发,可以设置的大一些,一般设置的是256M

-XX:MaxMetaspaceSize:元空间的最大值默认是无限大,一般设置与-XX:MetaspaceSize大小一样。

(tips:

   -XX:MetaspaceSize=256m

的含义到底是什么呢?其实,这个JVM参数是指Metaspace扩容时触发FullGC的初始化阈值,也是最小的阈值。这里有几个要点需要明确:

  1. 如果没有配置

    -XX:MetaspaceSize

    ,那么触发FGC的阈值是21807104(约20.8m),可以通过jinfo -flag MetaspaceSize pid得到这个值;jps -v也可以查看jvm的参数设置情况。
  2. 如果配置了

    -XX:MetaspaceSize

    ,那么触发FGC的阈值就是配置的值;
  3. Metaspace由于使用不断扩容到

    -XX:MetaspaceSize

    参数指定的量,就会发生FGC;且之后每次Metaspace扩容都可能会发生FGC(至于什么时候会,比较复杂,跟几个参数有关);
  4. 如果Old区配置CMS垃圾回收,那么扩容引起的FGC也会使用CMS算法进行回收;
  5. 如果MaxMetaspaceSize设置太小,可能会导致频繁FullGC,甚至OOM;)

-XX:+ExplicitGCInvokesConcurrent或-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses:如果希望Full gc有更少的停机时间,可以启用

-Xloggc:file :与-verbose:gc功能类似。只是将每次GC事件的相关情况记录到一个文件中,文件的位置最好是在本地,以避免

-Xprof:跟踪正在运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试

-Xrunhprof:HPEOF是J2SE自带的一个内存使用分析工具profile agent。是一个动态链接库文件,监控CPU的使用率,Heap分配情况等。将这些信息输出到文件或者socket。从而找到占用内存较大的对象。对与经常出现内存泄漏(OOM)的Java系统进行调优很有帮助。

-Xdebug:JVM调试参数,用于远程调试。

二、分类

1.标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;

2.非标准参数(-X),默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容;

3.非Stable参数(-XX),此类参数各个JVM实现会有所不同,这些都是不稳定的并且不推荐在生产环境中使用。将来可能会随时取消,需要慎重使用。例如:-XX:PermSize=64m;-XX:MaxPermSize=512m。

tips:1)布尔型参数选项:-XX:+打开,-XX:-关闭。(比如-XX:+PrintGCDetails)

2)数字型参数选项通过-XX:=设定。数字可以是m/M(兆字节),k/K(千字节),g/G(G字节)

比如32K表示32768字节。(比如-XX:HeapDumpPath=./java_pid.hprof)

3)字符行参数选项通过-XX:=设定,通常用来指定一个文件,路径,或者一个命令列表。(比如-XX:+PrintGCDetails)

tips:verbose

-verbose:class

输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。

-verbose:gc

输出每次GC的相关情况。

-verbose:jni

输出native方法调用的相关情况,一般用于诊断jni调用错误信息。