JAVA垃圾收集器之Serial Old收集器

Serial Old收集器是JAVA虚拟机中垃圾收集器的一种,它是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。这个收集器的主要也是在目前的JAVA的Client模式下的虚拟机使用。如果在Server模式下,它主要还有两大用途:一个是在JDK
1.5及之前的版本中与Parallel Scavenge收集器搭配使用,另外一个就是作为CMS收集器的后备预案。如果CMS收集器出现Concurrent
Mode Failure,则Serial Old收集器将作为后备收集器。

1、简单示例

源代码

package com.gc;

import java.util.ArrayList;

import java.util.List;

/**

* 简单的JAVA虚拟机内存回收,serial old收集器的使用

* 参数:-Xms30m -Xmx100m-Xmn10m -XX:+UseSerialGC -XX:+PrintGCDetails

* @author 范芳铭

*/

public class EasySerialOld {

public byte[] placeHolder =new byte[64 * 1024]; //占位符

public static voidmain(String[] args) throws Exception{

outOfMemoryByExpansionSize();

}

private static voidoutOfMemoryByExpansionSize() throws Exception{

List<EasySerialOld>list = new ArrayList<EasySerialOld>();

while(true){

EasySerialOldserial = new EasySerialOld();

list.add(serial);

Thread.sleep(10);//停顿10毫秒

}

}

}

参数

-Xms30m  JVM最小30M

-Xmx100m  JVM最大100M

-Xmn10m  新生代固定10M

-XX:+UseSerialGC  对应serial + serial old
收集器

-XX:+PrintGCDetails 打印详细GC

运行结果

[GC [DefNew: 8137K->1023K(9216K),0.0070798 secs] 8137K->8019K(29696K), 0.0071114 secs] [Times: user=0.00sys=0.00, real=0.01 secs]

[GC [DefNew: 9175K->963K(9216K),0.0056184 secs] 16170K->16151K(29696K), 0.0056422 secs] [Times: user=0.00sys=0.00, real=0.00 secs]

[GC [DefNew: 9149K->964K(9216K),0.0050408 secs][Tenured: 23320K->23388K(23424K), 0.0030744 secs]24337K->24284K(32640K), [Perm : 2086K->2086K(12288K)], 0.0082092 secs][Times: user=0.00 sys=0.00, real=0.01 secs]

[GC [DefNew: 8166K->964K(9216K),0.0052883 secs] 31555K->31522K(48200K), 0.0053220 secs] [Times: user=0.00sys=0.00, real=0.01 secs]

[GC [DefNew: 9118K->962K(9216K),0.0050018 secs] 39676K->39654K(48200K), 0.0050367 secs] [Times: user=0.00sys=0.02, real=0.00 secs]

[GC [DefNew: 9108K->966K(9216K),0.0049332 secs][Tenured: 46824K->46893K(46920K), 0.0033687 secs]47800K->47790K(56136K), [Perm : 2086K->2086K(12288K)], 0.0084489 secs][Times: user=0.02 sys=0.00, real=0.01 secs]

[GC [DefNew: 8141K->963K(9216K),0.0056947 secs] 55034K->55026K(87372K), 0.0057206 secs] [Times: user=0.00sys=0.00, real=0.01 secs]

[GC [DefNew: 9099K->962K(9216K),0.0046619 secs] 63162K->63158K(87372K), 0.0046951 secs] [Times: user=0.00sys=0.00, real=0.00 secs]

[GC [DefNew: 9102K->968K(9216K),0.0048499 secs] 71298K->71296K(87372K), 0.0048757 secs] [Times: user=0.00sys=0.00, real=0.00 secs]

[GC [DefNew: 9104K->962K(9216K),0.0053368 secs][Tenured: 78465K->78531K(78540K), 0.0035892 secs]79431K->79427K(87756K), [Perm : 2086K->2086K(12288K)], 0.0090187 secs][Times: user=0.00 sys=0.00, real=0.01 secs]

[GC [DefNew: 8134K->962K(9216K),0.0061709 secs] 86665K->86663K(101376K), 0.0061952 secs] [Times: user=0.00sys=0.00, real=0.01 secs]

[GC [DefNew: 9096K->9096K(9216K),0.0000242 secs][Tenured: 85701K->92157K(92160K), 0.0230609 secs]94797K->94783K(101376K), [Perm : 2086K->2084K(12288K)], 0.0231402 secs][Times: user=0.03 sys=0.00, real=0.02 secs]

[Full GC [Tenured:92157K->92157K(92160K), 0.0044209 secs] 101264K->101260K(101376K), [Perm: 2084K->2084K(12288K)], 0.0044763 secs] [Times: user=0.00 sys=0.00,real=0.00 secs]

[Full GC [Tenured:92157K->92151K(92160K), 0.0072855 secs] 101260K->101254K(101376K), [Perm: 2084K->2084K(12288K)], 0.0073138 secs] [Times: user=0.00 sys=0.00,real=0.01 secs]

Exception in thread "main"java.lang.OutOfMemoryError: Java heap space

atcom.gc.EasyParNew.<init>(EasyParNew.java:12)

atcom.gc.EasyParNew.outOfMemoryByExpansionSize(EasyParNew.java:39)

atcom.gc.EasyParNew.main(EasyParNew.java:14)

Heap

def new generation   total 9216K, used 9152K [0x03b70000,0x04570000, 0x04570000)

eden space 8192K, 100% used [0x03b70000, 0x04370000, 0x04370000)

from space 1024K,  93% used[0x04470000, 0x045600f0, 0x04570000)

to   space 1024K,   0% used [0x04370000, 0x04370000, 0x04470000)

tenured generation   total 92160K, used 92151K [0x04570000,0x09f70000, 0x09f70000)

the space 92160K,  99% used[0x04570000, 0x09f6de68, 0x09f6e000, 0x09f70000)

compacting perm gen  total 12288K, used 2105K [0x09f70000,0x0ab70000, 0x0df70000)

结果分析

[GC [DefNew: 9149K->964K(9216K),0.0050408 secs][Tenured: 23320K->23388K(23424K), 0.0030744 secs]24337K->24284K(32640K), [Perm : 2086K->2086K(12288K)], 0.0082092 secs][Times: user=0.00 sys=0.00, real=0.01 secs]

Tenured:23320K->23388K(23424K) ,老年代在回收垃圾(本代码用来做内存溢出是好手…),空间没有了,但是JVM最大划分了100M,可以继续调配空间。于是又来了第二次:

[GC [DefNew: 9104K->962K(9216K),0.0053368 secs][Tenured: 78465K->78531K(78540K), 0.0035892 secs]79431K->79427K(87756K), [Perm : 2086K->2086K(12288K)], 0.0090187 secs][Times: user=0.00 sys=0.00, real=0.01 secs]

Tenured: 78465K->78531K(78540K) ,老年代空间明显变大了… 很快,100M空间就用完了

用[Full GC[Tenured: 92157K->92157K(92160K), 0.0044209 secs] 101264K->101260K(101376K),[Perm : 2084K->2084K(12288K)], 0.0044763 secs] [Times: user=0.00 sys=0.00,real=0.00 secs]进行强力回收,也没有用,于是挂掉了…

时间: 2024-11-08 23:23:31

JAVA垃圾收集器之Serial Old收集器的相关文章

JAVA垃圾收集器之Parallel Old收集器

Parallel Old收集器是JAVA虚拟机中垃圾收集器的一种.和Serial Old收集器一样,工作在JAV虚拟机的老年代.这种垃圾收集器使用多线程和"标记-整理"算法.它在JDK 1.6中才开始提供. 在注重吞吐量及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器. 1.运行代码 package com.gc; import java.util.ArrayList; import java.util.List; /** * 简

JAVA垃圾收集器之Parallel Scavenge收集器

Parallel Scavenge收集器是JAVA虚拟机中垃圾收集器的一种.和ParNew收集器类似,是一个新生代收集器.使用复制算法的并行多线程收集器. 1.特点 Parallel Scavenge收集器的关注点与其他收集器不同, ParallelScavenge收集器的目标则是达到一个可控制的吞吐量(Throughput).所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间),虚拟机总共运行了100分钟,

JAVA垃圾收集器之Serial收集器

1.特点 Serial收集器是JAVA虚拟机中最基本.历史最悠久的收集器,在JDK 1.3.1之前是JAVA虚拟机新生代收集的唯一选择.Serial收集器是一个单线程的收集器,但它的"单线程"的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束. 要是服务器每运行一个小时就会暂停5分钟,老板会有什么样的心情? 2.发展 从JDK 1.3开始,一直到现在还没正式发布的JDK 1.7,HotSpo

JAVA垃圾收集器之CMS收集器

1.特点 CMS收集器是JAVA虚拟机中垃圾收集器的一种.它运行在JAVA虚拟机的老年代中.CMS是(Concurrent MarkSweep)的首字母缩写.CMS收集器是一种以获取最短回收停顿时间为目标的收集器.比较适用于互联网等场合,可能是互联网中最重要的收集器模式: 2.优点 由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行的.因此CMS是一款优秀的收集器,具备了并发收集.低停顿的优点

JAVA垃圾收集器之ParNew收集器

1.特点 ParNew收集器是JAVA虚拟机中垃圾收集器的一种.它是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio.-XX:PretenureSizeThreshold.-XX:HandlePromotionFailure等).收集算法.Stop The World.对象分配规则.回收策略等都与Serial收集器一致. 2.现状 ParNew是许多运行在Server模式下的虚拟机中首选的

JVM垃圾收集器-Serial Old收集器,Parallel Old收集器

Serial Old收集器 ? ? ? Serial Old收集器是Serial收集器的老年代版本,它是一个单线程收集器,使用"标记-整理"算法.这个收集器的主要意义也是被Client模式下的虚拟机使用.在server模式下,它主要还有两大用途:一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,另外一个就是作为CMS收集器的后备元,在并发收集发生 Concurrent Mode Failure的时候使用.? ? ??? ? Parallel Old收

Java垃圾收集器之--Garbage-First Collector

简介       Garbage-First(G1)垃圾收集器全面支持JDK7 Upate 4及后续版本.G1收集器是一个服务器形式(server-style)的垃圾收集器,主要用于内存大.多处理器的机器.当您想实现:与应用程序线程并发的执行全局标记,并且有高吞吐量.面向整个堆操作时,它可以满足您高可用性及GC暂停时间的要求. 此举可有效防止中断(GC时的暂停时间)与堆或者实时数据大小成比例增涨. 技术 G1收集器通过如下技术来实现高性能和低暂停时间: 堆被划分成一组相同大小的堆区域(heap

JAVA垃圾收集器之概说

1.垃圾收集器的组合 JAVA垃圾收集器一共有7个,减去还没有正式大规模使用的G1,还有6个,其中新生代3个,老生代3个. 因为垃圾收集器都是一组一组的工作,这6个收集器一共构成了5中使用模式. 参数 描述 -XX:+UseSerialGC Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收 -XX:+UseParNewGC 打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收 -XX:+UseConc

深入JVM虚拟机(四) Java GC收集器

深入JVM虚拟机(四) Java GC收集器 1 GC收集器 1.1 Serial串行收集器 串行收集器主要有两个特点:第一,它仅仅使用单线程进行垃圾回收:第二,它独占式的垃圾回收. 在串行收集器进行垃圾回收时,Java 应用程序中的线程都需要暂停("StopThe World"),等待垃圾回收的完成,这样给用户体验造成较差效果.虽然如此,串行收集器却是一个成熟.经过长时间生产环境考验的极为高效的收集器.新生代串行处理器使用复制算法,实现相对简单,逻辑处理特别高效,且没有线程切换的开销