您的位置:首页 > 其它

JVM Memory Management Parameters

2013-08-06 09:28 204 查看
下面选项用来设置JVM内存大小:

-Xmx: 设置JVM堆内存的最大容量,如java –Xmx256m XxxClass.

-Xms: 设置JVM堆内存的初始容量,如java –Xmx128m XxxClass.

-XX:MinHeapFreeRatio=40:设置Java堆内存最小的空闲百分比,默认值为40,如java –XX:MinHeapFreeRatio=40XxxClass。

-XX:MaxHeapFreeRatio=70:设置Java堆内存最大的空闲百分比,默认值为70,如java –XX:MaxHeapFreeRatio=70XxxClass。

-XX:NewRatio=2:设置Young/Old内存的比例,如java –XX:NewRatio=1 XxxClass。

-XX:NewSize=size:设置Yound代内存的默认容量,如java –XX:NewSize=64m XxxClass。

-XX:SurvivorRatio=8:设置Young代中eden/survivor的比例,如java–XX:SurvivorRatio=8 XxxClass。

-XX:MaxNewSize=size:设置Young代内存的最大容量,如java –XX:MaxNewSize=128m XxxClass。

-XX:PermSize=size:设置Permanent代内存的默认容量,如java –XX:PermSize=128m XxxClass。

-XX:MaxPermSize=64m:设置Permanent代内存的最大容量,如java –XX:MaxPermSize=128m XxxClass。

-XX:+UseSerialGC 串行回收器

-XX:+UseParallelGC并行回收器,当计算机CPU很多时,可用-XX:ParallelGCThreads=size来减少并行线程的数目。

并行压缩回收器和并行回收器最大的不同是对Old代的回收使用了不同的算法,并行压缩回收器最终会取代并行回收器。并行压缩回收器通过运行Java程序时使用-XX:+UseParallelOldGC附加选项启用,一样可通过-XX:ParallelGCTreads=size来设置并行线程的数目。

并行压缩回收器对于Young代采用与并行回收器完全相同的回收算法。并行压缩回收器的改变主要体现在对Old代的回收上。系统首先将Old代划分成几个固定大小的区域。在mark阶段,多个垃圾回收线程会并行标记Old代中的可达对象。当某个对象被标记为可达对象时,还会更新该对象所在区域的大小以及该对象的位置信息。接下来是Summary阶段。Summary阶段操作直接操作Old代的区域,而不是单个的对象。由于每次垃圾回收的压缩都会在old代的左边部分存储大量可达对象,对这样的高密度可达对象的区域进行压缩往往是不划算的。所以summary阶段会从最左边的区域开始检验每个区域的密度,当检测到某个区域中能回收的空间达到了某个数值的时候(也就是可达对象的密度较小时),垃圾回收器会判定该区域以及该区域右边的所有区域都应该进行回收,而该区域左边的区域都会被标识为密集区域,垃圾回收器既不会把新对象移动到这些密集区域中去,也不会对这些密集区域进行压缩,该区域和其右边的所有区域都会被进行压缩并回收空间。Summary阶段目前还是串行操作,虽然并行是可以实现的,但重要性不如对mark和压缩阶段的并行重要。最后是compact阶段。回收器利用summary阶段生成的数据识别出有哪些区域是需要装填的,多个垃圾回收线程可以并行地将数据复制到这些区域中。经过这个过程后,Old代的一端会密集地存在大量活动对象,另一端则存在大块的空闲块。

并发标识-清理回收器通过运行Java程序时使用-XX:+UseConcMarkSweepGC附加选项启用。

CMS回收器对Young代的回收方式和并行回收器的回收方式完全相同。由于对Young的回收依然采用复制回收算法,因此垃圾回收时依然会导致程序暂停,除非依靠多CPU并行来提高垃圾回收的速度。

通常来说,建议适当加大Young代的内存。如果Young代内存够大就不用频繁地进行垃圾回收,而且增加垃圾回收的时间间隔后可以让更多的Yound代对象自己死掉,从而避免复制。但内存设得过大的坏处是当垃圾回收器回收内存时,复制成本上升。

CMS对Old代的回收多数是并发操作,而不是并行操作。分为初始标识(initial mark)和并发标识阶段(concurrent marking phase)。

对于串行,标记压缩的回收器而言,它可以等到Old代满了之后再开始回收,反正垃圾回收总会让应用程序暂停。但CMS回收器要与应用程序并发运行,如果Old满了才开始回收,那应用程序将无内存可用,所以系统默认在Old代68%满的时候就开始回收。如果系统内存设得比较大,而且程序分配内存速度不是特别快时,可以通过-XX:CMSInitiatingOccupancyFraction=ratio适当增大这个比例。而且CMS不会进行内存压缩,也就是说不可达对象占用的内存被回收之后,垃圾回收器不会移动可达对象占用的内存。由于Old代的可用空间不是连续的,因此CMS垃圾回收器必须保存一份可用空间的列表。当需要分配对象的时候,垃圾回收器就要通过这份列表找到能容纳新对象的空间,这样就会使得分配内存时的效率下降,从而影响了Yound代回收过程中将Young代对象移到Old代的效率。

对于Permanent代内存,CMS可通过运行Java程序时使用-XX:+CMSClassUnloadingEnabled,-XX:+CMSPermGenSweepingEnabled附加选项强制回收Permanent代内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JVM Parameters