`
haitaoandroid
  • 浏览: 27711 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JVM垃圾收集器

 
阅读更多
各种收集器介绍:
Serial收集器:单线程收集器,必须暂停其他所有的工作线程,默认client模式下新生代的收集器
ParNew收集器:Serial的多线程版本,一般在Servr模式下的新生代首选收集器,除Serial外,目前只有它能与CMS收集器配合工作,ParNew收集器在单cpu的情况下不会有比Serial收集器更好的效果,甚至由于存在线程交互的开销,该收集器在通过超线程技术实现的两个cpu的环境中都一定能超越 Serial收集器。
Parallel Scavenge收集器:新生代收集器,使用复制算法,是并行的多线程收集器,跟其他收集器不一样,CMS等收集器是关注尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量是cpu用于运行用户代码的时间与cpu总消耗时间的比值。
Serial Old收集器:单线程收集器,是Serial收集器老年代版本,使用“标记-整理”算法,主要用在client模式下,
Parallel Old收集器:Parallel Scavenge收集器的老年代版本,在注重吞吐量及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge收集器家Parallel Old收集器。
CMS收集器:使用“标记-清除”算法,以获取最短回收停顿时间为目标,对于重视服务的相应速度,希望系统停顿时间最短的B/S系统的服务器端尤其有用。CMS收集器分4个步骤:1,初始标记 2,并发标记 3,重新标记 4,并发清除 耗时最长的并发标记和并发清除都可以与用户线程一起工作了。 还有三个缺点:1,对cpu资源敏感,默认启动的回收线程数是(cpu数量+3)/4,当cpu数较少的时候,会分掉大部分的cpu去执行收集器线程,影响用户,降低吞吐量。 2,无法处理浮动垃圾,浮动垃圾即在并发清除阶段因为是并发执行,还会产生垃圾,这一部分垃圾即为浮动垃圾,要等下次收集。3,因为使用的是“标记-清除”算法,会产生碎片。
G1收集器(Garbage First):基于“标记-整理”算法,之前的垃圾收集器都是整个新生代或者老生代,而G1将整个java堆(包括新生代和老生代)划分为多个大小固定的独立区域,并跟踪这些区域的垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,优先回收垃圾最多的区域(也是Garbage First的由来)。
下面是一个垃圾收集的例子,运行的参数为:
-verbose:gc -Xms20m -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+UseSerialGC
Xms20m表示分配的最小堆内存,Xmx20M表示最大堆内存,Xmn10m表示分给新生代的内存为10m,SurvivorRatio表示新生代的eden和from与to区域的内存占比,PrintGCDetails表示打印垃圾收集的日志信息,UseSerialGC表示新生代使用SerialGC收集器。
代码很简单,如下:
private static final int _1MB=1024*1024;
	public static void main(String[] args) throws Exception {
		byte[] a1,a2,a3,a4,a5,a6,a7;
		a1 = new byte[2*_1MB];
		a2 = new byte[2*_1MB];
		a3 = new byte[2*_1MB];
		
		System.out.println("1....");
		a4 = new byte[2*_1MB];
		
		a5 = new byte[2*_1MB];
		a6 = new byte[2*_1MB];
		System.out.println("2....");
		a7 = new byte[2*_1MB];
	}

运行之后,得到信息如下(详细解释在注释里面):
1....
[GC [DefNew: 6487K->151K(9216K), 0.0432371 secs] 6487K->6295K(19456K), 0.0433072 secs] [Times: user=0.02 sys=0.00, real=0.05 secs] 
2....
[GC [DefNew: 6381K->6381K(9216K), 0.0000447 secs][Tenured: 6144K->8192K(10240K), 0.4194740 secs] 12525K->12439K(19456K), [Perm : 374K->374K(12288K)], 0.4196179 secs] [Times: user=0.00 sys=0.00, real=0.42 secs] 
Heap
 def new generation   total 9216K, used 6459K [0x315e0000, 0x31fe0000, 0x31fe0000)
  eden space 8192K,  78% used [0x315e0000, 0x31c2ede0, 0x31de0000)
  from space 1024K,   0% used [0x31ee0000, 0x31ee0000, 0x31fe0000)
  to   space 1024K,   0% used [0x31de0000, 0x31de0000, 0x31ee0000)
 tenured generation   total 10240K, used 8192K [0x31fe0000, 0x329e0000, 0x329e0000)
   the space 10240K,  80% used [0x31fe0000, 0x327e0040, 0x327e0200, 0x329e0000)
 compacting perm gen  total 12288K, used 374K [0x329e0000, 0x335e0000, 0x369e0000)
   the space 12288K,   3% used [0x329e0000, 0x32a3d970, 0x32a3da00, 0x335e0000)
    ro space 10240K,  54% used [0x369e0000, 0x36f5ee00, 0x36f5ee00, 0x373e0000)
    rw space 12288K,  55% used [0x373e0000, 0x37a82800, 0x37a82800, 0x37fe0000)

因为新生代有10m的空间,内存一开始都是分配在新生代的eden区,eden区大小为8m,所以a1,a2,a3都能正常分配,eden区空闲的不完全有8m的空间,所以分配a4的时候没有足够的空间,因此要发生minor GC,而新生代的survivor区(1m)也无法将a4装入,所以只好通过担保机制转移到老年代,即1....下面的信息
[GC [DefNew: 6487K->151K(9216K), 0.0432371 secs] 6487K->6295K(19456K), 0.0433072 secs] [Times: user=0.02 sys=0.00, real=0.05 secs]
其中DefNew:6487k->151k表示新生代从占用6487k内存变到只占用151内存,即大约有6m的内存被转移走了,看代码,即知a1,a2,a3被转移到老年代去了,后面的6487k->6295k是表示总内存从占用6487k到6295k,基本上没变化。最后再给a4分配2m的内存,即现在新生代只放了a4,老生代放了a1,a2,a3.接下来a5,a6也被分配到新生代,新生代大约用了6m的样子,分配a7的时候新生代空间不够了,即发生第二次垃圾收集,即2.....下面的信息:
[GC [DefNew: 6381K->6381K(9216K), 0.0000447 secs][Tenured: 6144K->8192K(10240K), 0.4194740 secs] 12525K->12439K(19456K), [Perm : 374K->374K(12288K)], 0.41
从以上信息可知,新生代DefNew从6381k->6381k没有变化,老生代Tenured从6144k->8192k大约增长了2m,即a7是直接分配在老生代。后面的信息是各种内存的占比。



分享到:
评论

相关推荐

    直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景

    【JVM垃圾收集器概述】 Java虚拟机(JVM)的垃圾收集器是自动管理内存的重要组成部分,负责识别不再使用的对象并释放它们所占用的内存,以防止内存泄漏。垃圾收集器的选择和配置对应用程序的性能有着显著影响,特别...

    7种JVM垃圾收集器特点-优劣势-及使用场景.pdf

    "JVM垃圾收集器特点、优劣势及使用场景" JVM垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,负责回收Java程序中不再使用的对象,以避免内存泄漏和提高程序性能。Java中有多种垃圾收集器,每种垃圾收集器...

    04-VIP-JVM垃圾收集器详解1

    在Java世界中,JVM垃圾收集器是内存管理的重要组成部分,负责自动回收不再使用的对象,以释放内存空间。垃圾收集器的选取并非一成不变,而是需要根据具体应用的需求和环境来定制。本文将详细解析几种常见的JVM垃圾...

    深入理解JVM垃圾收集算法与垃圾收集器

    深入理解JVM垃圾收集算法与垃圾收集器

    JVM垃圾收集器全面详解

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾收集器(Garbage Collector, GC)。本文将全面解析JVM中的七种垃圾收集器,分析它们的特性和适用场景,帮助开发者理解如何优化Java应用的内存...

    JVM垃圾收集器详解

    【JVM垃圾收集器详解】 Java虚拟机(JVM)中的垃圾收集器是负责自动管理内存,特别是Java堆和方法区中的对象实例。它的主要任务是识别并清理不再使用的对象,以便释放内存资源。垃圾收集涉及到三个核心问题:确定...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    1.5CMS(Current Mark Sweep)收集器 1.6G1收集器 第六节:JVM参数调优 1.1 JVM重要参数介绍 1.2JVM参数调优 1.3JVM参数设置思路1.4JVM调优常用指令说明 第七节:JVM项目实战 1.1案例背景 1.2排查步骤 1.3....

    JvmGC收集器

    在 Java 虚拟机中,GC(Garbage Collection)收集器是 JVM 的一个重要组件,它负责回收 Java 应用程序中的垃圾对象,从而维持应用程序的性能和可靠性。JvmGC 收集器是 JVM 中的三个主要 GC 收集器之一,分别是 ...

    JVM初探- 内存分配、GC原理与垃圾收集器

    最后,JVM中提供了多种垃圾收集器,如Serial、Parallel、CMS、G1等,每种收集器都有其适用的场景和特点。例如,Serial收集器是单线程的,适用于小内存环境;而CMS(Concurrent Mark Sweep)收集器是追求低停顿时间的...

    JVM垃圾回收机制

    在Java编程中,JVM(Java虚拟机)的垃圾回收机制是自动管理内存的重要部分。垃圾回收机制负责回收那些不再被程序使用、即...开发者需要根据应用特点和运行环境选择合适的垃圾收集器和配置参数,以达到最优的性能表现。

    jvm思维导图 .pdf

    常见的JVM垃圾收集器包括: - Serial收集器:单线程,适合小型应用。 - ParNew收集器:Serial的多线程版本,常与CMS配合。 - Parallel Scavenge:关注吞吐量,适用于服务器环境。 - Serial Old、Parallel Old:...

    Jboss_JVM优化

    3. JVM垃圾收集器选择和配置 JVM提供了不同的垃圾收集器,包括串行收集器、并行收集器和并发标记清除(CMS)收集器。 -XX:+UseParallelGC:选择并行收集器,适用于新代(Young Generation)。 -XX:+UseParallelOldGC...

    jvmgc日志分析工具

    5. **参数调优建议**:根据分析结果,提供调整JVM垃圾收集器参数的建议,以优化性能。 6. **比较分析**:对比不同配置或不同时间段的GC日志,找出最佳实践。 为了有效地使用这类工具,你需要了解一些基本的JVM内存...

    关于jvm中卡表和写屏障的讨论1

    总结来说,卡表和写屏障是JVM垃圾收集器优化的重要组成部分。卡表提供了一种高效的方式来跟踪老年代对年轻代的引用,而写屏障则确保了这些引用的更新被正确地记录和处理。这种机制减少了全堆扫描的需求,显著提升了...

    JVM常用垃圾回收器的特性与使用场景.md

    该文档总结了JVM主要的七种垃圾回收器特点与区别,分别描述了他们作用于堆内存的哪些区域,采用单线程还是多线程工作方式,在运行过程中是否需要暂停其他用户工作线程。是笔者对周志明老师的《深入理解java虚拟机》...

    漫谈Java垃圾收集器.pdf

    Java垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,旨在释放程序员从手动内存管理的繁琐工作中解脱出来。垃圾收集器通过跟踪对象的引用关系,确定哪些对象是可以被释放的,然后将其回收,以避免内存泄露...

    Java理论与实践:JVM 1.4.1中的垃圾收集

    得出:随着JVM的发展,默认垃圾收集器变得越来越好了。JDK 1.2及以后版本所使用的分代垃圾收集器提供了比早期JDK所使用的标记-清除-整理收集器好得多的分配和收集性能。JDK 1.4.1通过增加新的针对多处理器系统和非常...

    Java的垃圾收集器(GC)

    3. **低优先级线程**:垃圾收集器通常以低优先级线程的形式运行,这意味着它只会在JVM处于空闲状态,或者系统内存压力较大时才被调度执行。这有助于平衡内存管理和应用程序性能之间的关系,避免频繁的GC操作影响程序...

Global site tag (gtag.js) - Google Analytics