leo*_*leo 26 java jvm jvm-arguments
我对GC算法有一些疑问:首先,当我们使用UseSerialGC,UseParallelGC,UseParallelOldGC等参数时,我们指定一个GC算法.他们每个人都可以在所有一代做GC,是不是?
例如,如果我使用"java -XX:+ UseSerialGC",则所有代都将使用串行GC作为GC算法.
第二,我可以在Old Gneneration中使用ParallelGC并在yong一代中使用SerialGC吗?
最后作为标题ParallelGC和ParallelOldGC之间的区别是什么?
小智 19
看一下HotSpot VM选项:
-XX:+ UseParallelGC =使用并行垃圾收集进行清除.(在1.4.1中引入).
-XX:+ UseParallelOldGC =对完整集合使用并行垃圾回收.启用此选项会自动设置-XX:+ UseParallelGC.(在5.0更新中引入6.)
Scavenges = Young generation GC.
那么,经过大量的搜索和研究,我所了解的内容如下,
-XX:+ UseParallelGC - 这使得GC能够在Young代中使用多个线程,但对于旧/终端生成,仍然使用Serial Mark和Compact算法.
-XX:+ UseParallelOldGC - 这使GC能够在旧/终身生成中使用Parallel Mark和Compact算法.
让我们理解 -
算法和内存安排,例如标记和复制,交换空间,在Young代中工作对于老一代不起作用的原因有很多
低死亡率 -在老一代中,"死亡率"显着低于年轻一代.在典型的Java应用程序中,大多数对象快速死亡,很少有人活得更 作为在年轻一代中生存并升级为老一代的物体,观察到这些物体往往寿命更长.与年轻一代相比,老一代的死亡率非常低.
显着的尺寸 -老一代明显大于年轻一代.由于年轻一代迅速清理,因此许多短寿命物体(小型年轻一代)的可用空间相对较小.在旧世代中,物体会随着时间的推移而累积.因此,老一代必须有更多的空间,而不是年轻一代(大一代)
少量分配 -在老一代中,分配比在年轻代中少.这是因为在Old Generation中,只有当垃圾收集器将幸存的对象从Young发送到Old Generation时才会出现对象.另一方面,在Young Generation中,应用程序使用new生成的所有对象,即大部分分配,都发生在Young Generation中.
考虑到这些差异,已经为年轻一代选择了一种算法,该算法将尽快完成垃圾收集,因为由于死亡率高,必须经常调用[点(1)].此外,算法必须确保最有效的内存分配[point(3)]是可能的,因为在Young Generation中分配了很多.Young Generation上的标记和复制算法具有这些属性.
另一方面,这种算法对老一代没有意义.情况有所不同:垃圾收集者必须照顾老一代的许多物品[第(2)点],其中大部分仍然存在; 只有一小部分变得无法到达并且可以被释放[第(1)项].如果垃圾收集器要复制每个垃圾收集中的所有幸存对象,就像使用标记和复制一样,那么它将花费大量时间复制它而不会获得太多收益.
因此,标记和扫描算法是在老一代上进行的,其中没有任何内容被复制,而是简单地释放了无法到达的对象.由于该算法导致堆的碎片,因此还考虑了标记和扫描算法的变化,其中,在扫描阶段之后,进行压缩,由此减少碎片.该算法称为标记 - 紧凑算法.
甲标记和紧凑的算法可能是耗时的,因为它需要遍历以下为阶段对象图.
在" 计算新位置"阶段中,当它获得可用空间时,尝试查找可以移动到此空间的对象(碎片整理).存储该对以供后续阶段使用.这会导致算法消耗更多时间.
虽然标记和比较解决了一些特定于终身代的问题,但由于这是一个STW(停止世界)事件而耗费了大量时间,会严重影响应用程序.
老一代的替代算法
为了减少中断时间,已经考虑了串行标记和紧凑算法的替代方案:
一种并行的标记和紧凑算法,它仍然锁存所有应用程序线程,但随后处理多个垃圾收集器线程的标记和后续压缩.虽然这仍然是一种停止世界的方法,但在多核或多处理器机器上产生的暂停比串行标记和紧凑算法更短.旧版本上的这种并行算法(称为"ParallelOld")自Java 5 Update 6开始提供,并使用选项-XX:+ UseParallelOldGC进行选择.
一种竞争的标记和扫描算法,至少可以在不停止其线程的情况下与应用程序相媲美,并且偶尔需要短暂的世界各个阶段.自Java 1.4.1以来,这种并发的标记和扫描算法(称为"CMS")已经存在; 它通过选项-XX:+ UseConcMarkSweepGC打开.重要的是,这只是一种标记和扫描算法; 压缩不会发生,导致已经讨论过的碎片化问题.
简而言之-XX:+ UseParallelOldGC用作使用Mark和Compact算法进行主要收集时使用多个线程的指示.如果使用它,则minor或young集合是并行的,但主要集合仍然是单线程的.
我希望这个答案.
| 归档时间: |
|
| 查看次数: |
28069 次 |
| 最近记录: |