Java Garbage Collection基础之Java 垃圾回收机制技术详(3)

Java Garbage Collection基础之Java 垃圾回收机制技术详

5、在下一个小垃圾收集,同样的过程反复进行。然而,此时Survivor分区的角色发生了互换,引用对象被移动到S0,幸存对象年龄增大。Eden和S1被清理。

Java Garbage Collection基础之Java 垃圾回收机制技术详

6、这幅图展示了从年轻代到老年代的提升。当进行一个小垃圾收集之后,如果此时年老对象此时到达了某一个个年龄阈值(例子中使用的是8),JVM会把他们从年轻代提升到老年代。

Java Garbage Collection基础之Java 垃圾回收机制技术详

7、随着小垃圾收集的持续进行,对象将会被持续提升到老年代。

Java Garbage Collection基础之Java 垃圾回收机制技术详

8、这样几乎涵盖了年轻一代的整个过程。最终,在老年代将会进行大垃圾收集,这种收集方式会清理-压缩老年代空间。

Java Garbage Collection基础之Java 垃圾回收机制技术详

五、JVM垃圾收集器的种类

现在我们已经知道垃圾收集器的一些基本原理,并且借助VisualVM可以观察到垃圾收集器的实时表现。本节将会详细讲解Java可以使用的垃圾回收器,以及在命令行如何选用配置它们。配置JVM有很多可以用的命令行参数,本节选用常用的配置参数进行详细解。

与堆配置相关的参数

Java中有很多可以使用的命令行参数,这一节将会介绍常用的一些命令行参数。

  参数   描述  
-Xms   JVM启动的时候设置初始堆的大小  
-Xmx   设置最大堆的大小  
-Xmn   设置年轻代的大小  
-XX:PermSize   设置持久代的初始的大小  
-XX:MaxPermSize   设置持久代的最大值  
1、串行收集器:

在Java SE 5和6中,串行收集器是客户端环境(client-style machines)机器的默认设置。在这种情况下,小垃圾收集和大垃圾收集都是串行进行的(使用单个的虚拟CPU)。

使用的算法说明:

串行收集器在年轻代使用的是拷贝算法,这个算法比较简单,在这里不做详述。而年老代和持久代使用标记-清扫-压缩(mark-sweep-compact)算法。标记阶段,收集器识别哪些对象仍然活着。清扫阶段“扫荡”整个代,识别垃圾。之后,收集器执行平移压缩(sliding compaction),将存活的对象平移到代的前端(持久代类似),相应的在尾部留下一整块连续的空闲空间。压缩后,以后的分配就可以在年老代和持久代使用空闲指针(bump-the-pointer)技术。这种压缩算法能够在堆上迅速分配内存块。

示例:大多数客户端式(client-style machines)机器上运行的应用程序通常都是选择串行收集器,这些应用对短暂停没有要求。它之所以叫这个名字,是因为它能充分利用单个虚拟处理器进行垃圾回收的工作。在今天的硬件上,串行收集器可以有效的管理许多拥有几百M堆内存的重要应用程序,并且拥有相对短的最坏暂停(Full GC仅有几秒左右)。

在有大量JVM运行在同一个机器上(在某些情况下,JVM的个数比可以用的处理器的个数多)的应用环境下,串行垃圾收集器也被广泛使用。在这种环境下,要进行垃圾回收的JVM最好使用一个处理器,虽然这样会使垃圾回收的时间变得更长,但可以降低与其他JVM的冲突。这时,使用串行垃圾回收器能够获得很好的权衡。最后,如果在较小的内存和较少的CPU核心上对硬件进行稍加扩充,将能获得更好的性能。

命令行参数

使用串行垃圾回收器 -XX:+UseSerialGC

给事例应用使用串行垃圾回收器的命令行如下:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar

2、并行收集器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8668d26b54d043e4fe56c41457388ab1.html