Java虚拟机5:jvm常见参数介绍

我们用IDEA开发的时候,配置不高的情况下经常会卡顿,这时候估计大家常有的做法,就是百度,参照网上,修改IDEA一系列的配置参数。那JVM中都有哪些常见参数呢?下面就来数一数,二四六七八。

常用参数

堆中各区大小分配:

-Xms:初始堆大小

-Xmx:最大堆大小

-XX:NewSize=n:设置年轻代大小

-XX:NewRatio=n:设置年轻代和年老代的比值。如:n=3,表示年轻代与年老代的比值为1:3,年轻代站整个年轻代年老代之和的四分之一。

-XX:SurvivorRatio=n,年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如n=3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的五分之一。

-XX:MaxPermSize=n,设置持久代大小

 

收集器设置:

-XX:+UseSerialGC 设置串行收集器。

-XX:+UseParallelGC 设置并行收集器

-XX:+UseParallelOldGC 设置并行年老代收集器

-XX:+UseConcMarkSweepGC 设置并发收集器 

 

垃圾回收统计信息:

-XX:+PrintGC

-XX:+Printetails

-XX:+PrintGCTimeStamps

-Xloggc:filename

 

并行收集器设置:

-XX:ParallelGCThreads=n,设置并行收集器收集时使用的CPU数,并行收集线程数。

-XX:MaxGCPauseMillis=n设置并行收集最大暂停时间

-XX:GCTimeRatio=n设置垃圾回收时间占程序运行时间的百分比,公式为 1/ (1+n)

 

并发收集器设置:

-XX:+CMSIncrementalMode设置为增量模式,适用于单CPU情况。

-XX:ParallelGCThreads=n设置并发收集器年轻代收集方式为并行收集时,适用的CPU数

 

常见的配置举例

堆大小设置

JVM中最大堆大小有三方面限制:

  1. 相关操作系统的数据模型(32-bit还是64-bit)限制;
  2. 系统的可用虚拟机内存限制;
  3. 系统的可用物理内存限制。

32位系统下,一般限制在1.5G~2G;64位操作系统对内存无限制。

 

典型设置:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

-Xmx2330m:设置JVM最大可用内存为3550M。

-Xms3550m:设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小+年老代大小+持久代大小。持久代,一般固定大小为64m,所有增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐的配置为整个堆的3/8(八分之三)。

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

 

java -Xmx3550m -Xms3550m  -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m  

-XX:MaxTenuringThreshold=0

相同参数参照第一条,不同参数,参照下面:

-XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的五分之一。

-XX:SurvivorRatio=4,设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的六分之一。

-XX:MaxPermSize=16m,设置持久代大小为16M。

-XX:MaxTenuringThreshold=0设置垃圾最大年龄。如果设置为0的话,则年轻嗲对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概率。

 

回收器选择,JVM给了三种选择:串行收集器,并行收集器,并发收集器。但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都适用串行收集器,如果想使用其它的收集器需要在启动时加入相应的参数。JK5.0以后,JVM会根据当前系统配置进行判断,选择用哪个收集器。

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(jvm)