Java虚拟机的相关参数设置与调优


1 目 录 1.java 虚拟机 .......................................................................................................................................2 2.Java 虚拟机体系结构 .......................................................................................................................2 3.Java 虚拟机区别活动对象与垃圾的方法 .......................................................................................2 3.1 采用 Reference Counting 的垃圾回收器.............................................................................2 3.2 采用 Tracing 的垃圾回收器.................................................................................................2 4.基本回收算法 ...................................................................................................................................3 4.1 引用计数( Reference Counting).......................................................................................3 4.2 标记-清除(Mark-Sweep).................................................................................................3 4.3 复制(Copying).................................................................................................................3 4.4 增量收集( Incremental Collecting)..................................................................................3 4.5 分代(Generational Collecting).........................................................................................3 4.5.1 分代垃圾回收详述 ....................................................................................................4 4.5.2 分代垃圾回收演示过程: ........................................................................................5 5.垃圾回收器.......................................................................................................................................7 5.1 发生垃圾回收的两种类型: Scavengc GC 和 Full GC。....................................................7 5.1.1 Scavenge GC ...............................................................................................................7 5.1.2 Full GC........................................................................................................................8 5.2 使用的垃圾收集器种类 ........................................................................................................8 5.3 小结:....................................................................................................................................9 6.常见配置举例 ...................................................................................................................................9 6.1 堆大小设置 ...........................................................................................................................9 6.2 回收器选择 ..........................................................................................................................10 6.2.1 吞吐量优先的并行收集器 .......................................................................................10 6.2.2 响应时间优先的并发收集器 ...................................................................................11 7.调优总结.........................................................................................................................................11 7.1 年轻代大小选择 .................................................................................................................11 7.2 年老代大小选择 ..................................................................................................................11 7.2.1 响应时间优先的应用 ...............................................................................................11 7.2.2 吞吐量优先的应用: ..............................................................................................12 附:JVM 相关参数设置 ...................................................................................................................12 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 2 Java 虚拟机的相关参数设置与调优 1.java 虚拟机 java 虚拟机是一个想象中的机器 ,在实际 8ttt8 的计算机上通过软件模拟来实现。 java 虚拟 机有自己想象中的硬件 ,如处理器、堆栈、寄存器等 ,还具有相应的指令系统。 2.Java 虚拟机体系结构 java 虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆 (garbage-collected-heap)、一个方法区域。这五部分是 java 虚拟机的逻辑成份 ,不依赖任何实现 技术或组织方式 ,但它们的功能必须在真实机器上以某种方式实现。 3.Java 虚拟机区别活动对象与垃圾的方法 Java 虚拟机可以有两种不同的方法来区别活动对象与垃圾:引用计数 (Reference Counting) 与跟踪(Tracing) 3.1 采用 Reference Counting 的垃圾回收器 对于采用 Reference Counting 的垃圾回收器,系统为堆上每一个对象都维护一个计数器, 当一个对象被创建并且别引用时,这个计数就被置为 1。当有新的变量引用该对象,计数器进 行自加运算。当一个引用超出作用范围或者被赋予新值的时候,计数器进行自减运算。引用 计数为 0 的对象,会被作为垃圾回收。当一个对象被回收,该对象所引用的对象的引用计数 都会相应减少,因而,一个对象的回收有时会引起其它对象的回收。 Reference Counting 方式 的垃圾回收器,好处在于可以在很短的时间内运行,不会长时间的中断普通的程序运行,因 而在 RealTime 的系统中应用较为普遍。 Reference Counting 方式的垃圾回收器,问题在于无法 识别循环引用,比如父类对象还有子类引用的情况,即便父类和子类都已经不再能被访问到 (unreachable),引用计数也把它们清除。另外一个问题是引用计数器的加减运算会增加系统的 计算开销。 3.2 采用 Tracing 的垃圾回收器 采用 Tracing 的垃圾回收器,遍历由根节点 (root nodes)出发的引用关系图。在遍历过程中 遇到的对象,就被标记为活动。标记既可以是对应对象中的某一个标志,也可以是独立的位 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 3 图中的标志。当遍历完成以后,那些没有被标记的对象,就被作为垃圾回收了。 最基本 Tracing 算法是"Mark and Sweep"垃圾回收器的另外一个责任是清除堆上的碎片 (Fragmentation)。对于 Mark and Sweep 的垃圾回收器通常有两种实现方法来减少堆上的碎片: 压缩(Compacting)和拷贝(Copying)。 4.基本回收算法 4.1 引用计数( Reference Counting) 比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减 少一个计数。垃圾回收时,只用收集计数为 0 的对象。此算法最致命的是无法处理循环引用 的问题。 4.2 标记-清除(Mark-Sweep) 此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍 历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。 4.3 复制( Copying) 此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历 当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中 的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现 “碎片” 问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。 标记-整理( Mark-Compact) 此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点 开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩” 到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制” 算法的空间问题。 4.4 增量收集( Incremental Collecting) 实施垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因 JDK5.0 中的 收集器没有使用这种算法的。 4.5 分代( Generational Collecting) 基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代, 对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 4 (从 J2SE1.2 开始)都是使用此算法的。 4.5.1 分代垃圾回收详述 Java 堆分可为 Young(年轻代),Tenured(年老代),Perm(持久代)三个部分,下面是各代的 分布情况。 l Young(年轻代) 年轻代分三个区。一个 Eden 区,两个 Survivor 区。大部分对象在 Eden 区中生成。当 Eden 区满时,还存活的对象将被复制到 Survivor 区(两个中的一个),当这个 Survivor 区满时, 此区的存活对象将被复制到另外一个 Survivor 区,当这个 Survivor 去也满了的时候,从第一 个 Survivor 区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意, Survivor 的两个区是对称的,没先后关系,所以同一个区中可能同时存在从 Eden 复制过来对 象,和从前一个 Survivor 复制过来的对象,而复制到年老区的只有从第一个 Survivor 去过来 的对象。而且,Survivor 区总有一个是空的。 l Tenured(年老代) 年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。 l Perm(持久代) 用于存放静态文件,如今 Java 类、方法等。持久代对垃圾回收没有显著影响,但是有些 应用可能动态生成或者调用一些 class,例如 Hibernate 等,在这种时候需要设置一个比较大的 持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设 置。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 5 4.5.2 分代垃圾回收演示过程: Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 6 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 7 5.垃圾回收器 5.1 发生垃圾回收的两种类型: Scavengc GC 和 Full GC。 5.1.1 Scavenge GC 一般情况下,当新对象生成,并且在 Eden 申请空间失败时,就好触发 Scavenge GC,堆 Eden 区域进行 GC,清除非存活对象,并且把尚且存活的对象移动到 Survivor 区。然后整理 Survivor 的两个区。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 8 5.1.2 Full GC 对整个堆进行整理,包括 Young、Tenured 和 Perm。Full GC 比 Scavenge GC 要慢,因此 应该尽可能减少 Full GC。有如下原因可能导致 Full GC: l Tenured 被写满 l Perm 域被写满 l System.gc()被显示调用 l 上一次 GC 之后 Heap 的各域分配策略动态变化 5.2 使用的垃圾收集器种类 目前所使用的垃圾收集器主要有三种:串行收集器、并行收集器、并发收集器。 l 串行收集器 使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也 无法使用多处理器的优势,所以此收集器适合单处理器机器。当然,此收集器也可以用在小 数据量(100M 左右)情况下的多处理器机器上。可以使用 -XX:+UseSerialGC 打开。 l 并行收集器 对年轻代进行并行垃圾回收,因此可以减少垃圾回收时间。一般在多线程多处理器机器 上使用。使用 -XX:+UseParallelGC.打开。并行收集器在 J2SE5.0第六 6 更新上引入,在 Java SE6.0 中进行了增强,可以对年老代进行并行收集。如果年老代不使用并发收集的话,是使用单线 程进行垃圾回收,因此会制约扩展能力。使用 -XX:+UseParallelOldGC 打 开 。 使 用 -XX:ParallelGCThreads=设置并行垃圾回收的线程数。此值可以设置与机器处理器数量相 等。 此收集器可以进行如下配置: 最大垃圾回收暂停:指定垃圾回收时的最长暂停时间,通过 -XX:MaxGCPauseMillis= 指定。为毫秒.如果指定了此值的话,堆大小和垃圾回收相关参数会进行调整以达到指定 值。设定此值可能会减少应用的吞吐量。 吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值,通过 -XX:GCTimeRatio=来 设定,公式为 1/(1+N)。例如, -XX:GCTimeRatio=19 时,表示 5%的时间用于垃圾回收。默 认情况为 99,即 1%的时间用于垃圾回收。 l 并发收集器 可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器 适合对响应时间要求比较高的中、大规模应用。使用 -XX:+UseConcMarkSweepGC 打开。 并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收 线程,跟踪可达对象。在每个年老代垃圾回收周期中,在收集初期并发收集器会对整个应用 进行简短的暂停,在收集中还会再暂停一次。第二次暂停会比第一次稍长,在此过程中多个 线程同时进行垃圾回收工作。 并发收集器使用处理器换来短暂的停顿时间。在一个 N 个处理器的系统上,并发收集部 分使用 K/N 个可用处理器进行回收,一般情况下 1<=K<=N/4。 在只有一个处理器的主机上使用并发收集器,设置为 incremental mode 模式也可获得较 短的停顿时间。 浮动垃圾:由于在应用运行的同时进行垃圾回收,所以有些垃圾可能在垃圾回收进行完 成时产生,这样就造成了 “Floating Garbage”,这些垃圾需要在下次垃圾回收周期时才能回收掉。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 9 所以,并发收集器一般需要 20%的预留空间用于这些浮动垃圾。 Concurrent Mode Failure:并发收集器在应用运行时进行收集,所以需要保证堆在垃圾回 收的这段时间有足够的空间供程序使用,否则,垃圾回收还未完成,堆空间先满了。这种情 况下将会发生 “并发模式失败 ”,此时整个应用将会暂停,进行垃圾回收。 启动并发收集器:因为并发收集在应用运行时进行收集,所以必须保证收集完成之前 有足够的内存空间供程序使用,否则会出现 “Concurrent Mode Failure” 。 通 过 设 置 -XX:CMSInitiatingOccupancyFraction=指定还有多少剩余堆时开始执行并发收集 5.3 小结: l 串行处理器: --适用情况:数据量比较小( 100M 左右);单处理器下并且对响应时间无要求的应用。 --缺点:只能用于小型应用 l 并行处理器: --适用情况: “对吞吐量有高要求 ”,多 CPU、对应用响应时间无要求的中、大型应用。举 例:后台处理、科学计算。 --缺点:应用响应时间可能较长 l 并发处理器: --适用情况: “对响应时间有高要求 ”,多 CPU、对应用响应时间有较高要求的中、大型应 用。 举例:Web 服务器 /应用服务器、电信交换、集成开发环境。 6.常见配置举例 6.1 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型( 32-bt 还是 64-bit)限制; 系统的可用虚拟内存限制;系统的可用物理内存限制。 32 位系统下,一般限制在 1.5G~2G; 64 为操作系统对内存无限制。在 Windows Server 2003 系统,3.5G 物理内存, JDK5.0 下测试, 最大可设置为 1478m。 典型设置:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -Xmx3550m:设置 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 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 10 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 -XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与年老代的比值(除去持 久代)。设置为 4,则年轻代与年老代所占比值为 1:4,年轻代占整个堆栈的 1/5 -XX:SurvivorRatio=4:设置年轻代中 Eden 区与 Survivor 区的大小比值。设置为 4,则两 个 Survivor 区与一个 Eden 区的比值为 2:4,一个 Survivor 区占整个年轻代的 1/6 -XX:MaxPermSize=16m:设置持久代大小为 16m。 -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象不 经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值 设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻 代的存活时间,增加在年轻代即被回收的概论。 6.2 回收器选择 JVM 给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于 小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下, JDK5.0 以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。 JDK5.0 以后, JVM 会根据当前系统配置进行判断。 6.2.1 吞吐量优先的并行收集器 如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理 等。 典型配置: java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配 置下,年轻代使用并发收集,而年老代仍旧使用串行收集。 -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃 圾回收。此值最好配置与处理器数目相等。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。 JDK6.0 支持对年老代并 行收集。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时 间,JVM 会自动调整年轻代大小,以满足此值。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相 应的 Survivor 区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用 并行收集器时,一直打开。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 11 6.2.2 响应时间优先的并发收集器 如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适 用于应用服务器、电信领域等。 典型配置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC :设置年老代为并发收集。测试中配置这个以后, -XX:NewRatio=4 的配置失效了,原因不明。所以,此时年轻代大小最好用 -Xmn 设置。 -XX:+UseParNewGC:设置年轻代为并行收集。可与 CMS 收集同时使用。 JDK5.0 以上, JVM 会根据系统配置自行设置,所以无需再设置此值。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所 以运行一段时间以后会产生 “碎片”,使得运行效率降低。此值设置运行多少次 GC 以后对内存 空间进行压缩、整理。 -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可 以消除碎片. 7.调优总结 7.1 年轻代大小选择 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况 选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。 吞吐量优先的应用:尽可能的设置大,可能到达 Gbit 的程度。因为对响应时间没有要求, 垃圾收集可以并行进行,一般适合 8CPU 以上的应用。 7.2 年老代大小选择 7.2.1 响应时间优先的应用 : 年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续 时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用 传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考 以下数据获得: l 并发垃圾收集信息 l 持久代并发收集次数 l 传统 GC 信息 l 花在年轻代和年老代回收上的时间比例 l 减少年轻代和年老代花费的时间,一般会提高应用的效率 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 12 7.2.2 吞吐量优先的应用: 一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以 尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。 7.2.3 较小堆引起的碎片问题 因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收 时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运 行一段时间以后,就会出现 “碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会 停止,然后使用传统的标记、清除方式进行回收。如果出现 “碎片”,可能需要进行如下配置: -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。 -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次 Full GC 后,对年老代进行压缩 附:JVM 相关参数设置 常见配置汇总 l 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:MaxNewSize=n:设置年轻代的最大空间 -XX:NewRatio=n:设置年轻代和年老代的比值。如 :为 3,表示年轻代与年老代比值为 1:3, 年轻代占整个年轻代年老代和的 1/4 -XX:SurvivorRatio=n:年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor 区有两个。 如:3,表示 Eden:Survivor=3:2,一个 Survivor 区占整个年轻代的 1/5 -XX:MaxPermSize=n:设置持久代大小 -XX:MinHeapFreeRatio=最小 Heap 可用空间百分比当可用的 Heap 空间少于这个百分比, 则这个 Generation 的 Heap 空间就会增长,以满足这个百分比 -XX:MaxHeapFreeRatio=最大 Heap 可用空间百分比当可用空间百分比超出这个数值,该 Generation 的 Heap 空间会减少,以满足该百分比。 l 收集器设置 -XX:+UseSerialGC:设置串行收集器 -XX:+UseParallelGC:设置并行收集器 -XX:+UseParalledlOldGC:设置并行年老代收集器 -XX:+UseConcMarkSweepGC:设置并发收集器 l 垃圾回收统计信息 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename l 并行收集器设置 -XX:ParallelGCThreads=n:设置并行收集器收集时使用的 CPU 数。并行收集线程数。 -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 13 -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为 1/(1+n) l 并发收集器设置 -XX:+CMSIncrementalMode:设置为增量模式。适用于单 CPU 情况。 l 其他 -XX:+CMSPermGenSweepingEnabled —— enable concurrent gc in permanent generation -XX:+CMSClassUnloadingEnabled —— enable class unloading in permanent generation with the concurrent gc collector -XX:+CMSPermGenPrecleaningEnabled —— enable pre-cleaning when using concurrent gc collector in permanent generation -XX:SoftRefLRUPolicyMSPerMB ——softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

lamjaneson

贡献于2011-02-09

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf