`
zhaonjtu
  • 浏览: 129758 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java gc 学习

阅读更多

   今天粗略的看了下java的gc, http://calvin.iteye.com/blog/91905。以前也看过一些,但是怎么找到测试的环境来验证参数的改变带来的变化呢。有一点要说名的是jvm规范并未说明java gc采取什么样的策略,所以在各个jvm的实现也有所不同。在了解基本概念之前,其实我们可以想想,gc主要就是负责那些占用了内存资源的对象的管理,或者说是对垃圾对象(不再使用)的回收java的gc说白了就是对java内存(也就是堆的管理)。因此肯定会对这些对象的生命周期不同而分类,分完类后就会采用什么样的策略去处理这些垃圾对象。

基本概念:
根据对象的生命周期分类:young,old,permanent。
young:新生代又分为Eden 和两片生存空间(survivor spaces)。所有新建对象都放在eden:两片生存区中保证有一片空间在任何时间是空的,当垃圾收集发生时,加入suvivor1是空的,survivor2里面是原先有的对象。当发生垃圾回收时,先把 Eden 中的活的对象复制到survivor1,再把survivor2复制到survivor1,然后清理eden和survior2.直到到达最大门限值(老化),然后复制到旧生代(old)。可以用-Xmn参数规定其大小。

old:young总是不断膨胀的,其中有些对象在young中发生的几次收集中始终都在survivor中存活,终于survivor的空间也撑不住了,于是这些对象被搬到了old区了(注:也有可能是young区的对象被收集了几次后被搬到old区,这个几次由参数-XX:MaxTenuringThreshold=参数 来设置)。当然old区也不是说这里面的对象就一直有效,old也是要垃圾清理的,但是young的垃圾清理不同,old区采用的是标记清理。所谓标记清理,就是先遍历一遍所有的对象,看看那些是活跃那些是垃圾,然后再遍历一次,清理垃圾。

Permanent,持久代。装载Class信息等基础数据,默认64M,如果是类很多很多的服务程序,需要加大其设置-

XX:MaxPermSize=,否则它满了之后会引起fullgc()或Out of Memory。 像Spring,Hibernate这类喜欢动态生成类的框架

需要更多的持久代内存。

 

young是一个比较活跃的区域,因此gc在对young收集频率很高,这种收集叫minor collection,而且使用的是复制算法。
而对old代则使用的是标记整理(或标记压缩整理),这种成本比较大。同时对young和old收集则是major collection。


GC收集器除了在具体执行回收的时候很容易理解外,因为策略的不同又有以下几种分类:

    A:串行收集器: 使用 -XX:+UseSerialGC,策略为年轻代串行复制,年老代串行标记整理。这种方法很老。
    B:吞吐量优先的并行收集器:使用 -XX:+UseParallelGC ,也是JDK5 -server的默认值。策略为:
    1.年轻代暂停应用程序,多个垃圾收集线程并行的复制收集,线程数默认为CPU个数,CPU很多时,可用–

XX:ParallelGCThreads=减少线程数。多cpu时代的选择,呵呵。
    2.年老代暂停应用程序,与串行收集器一样,单垃圾收集线程标记整理。

    可以使用-XX:MaxGCPauseMillis= 和 -XX:GCTimeRatio 来调整GC的时间。
    需要注意的是,不管是年轻代还是年老代都需要短暂的暂停应用。
   
    C:暂停时间优先的并发收集器(Concurrent Low Pause Collector-CMS) 
 使用-XX:+UseConcMarkSweepGC,简称CMS.策略为:
 1.年轻代同样是暂停应用程序,多个垃圾收集线程并行的复制收集。
       还是需要暂停应用,这个就是大型系统的瓶颈所在,特别是当年轻代变大的时候,整个复制时间长也就意味着
     暂停应用时间长。太小的话又会导致频繁的垃圾回收。
 2.年老代则只有两次短暂停,其他时间应用程序与收集线程并发的清除。
       这个改进比较大,大部分垃圾回收的时候应用是运行的。
 3.持久代也用CMS去收集而不是full gc。

在涉及到调优gc的时候,先要观察一下暂停时间显示,有了数据我们才好说话。
加入下列参数 (请将PrintGC和Details中间的空格去掉,CSDN很怪的认为是禁止字句) 

-verbose:gc -XX:+PrintGC Details  -XX:+PrintGCTimeStamps 

  

 

会程序运行过程中将显示如下输出

9.211: [GC 9.211: [ParNew: 7994K->0K(8128K), 0.0123935 secs] 427172K->419977K(524224K), 0.0125728 secs]

显示在程序运行的9.211秒发生了Minor的垃圾收集,前一段数据针对新生区,从7994k整理为0k,新生区总大小为8128k,

程序暂停了12ms,而后一段数据针对整个堆。

对于年老代的收集,暂停发生在下面两个阶段,CMS-remark的中断是17毫秒:

[GC [1 CMS-initial-mark: 80168K(196608K)] 81144K(261184K), 0.0059036 secs] 

[1 CMS-remark: 80168K(196608K)] 82493K(261184K),0.0168943 secs]

再加两个参数 -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime对暂停时间看得更清晰

分享到:
评论

相关推荐

    成为JavaGC专家(4)

    在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...

    JVM GC原理深入学习.pdf

    同时,为了能更深入理解与之相关的知识点,本文特地编写了“第二章 基础知识”,详细的讲解与GC学习相关的JVM架构、JVM选项、Object内存布局、指针压缩等内容,以便读者能更加清晰的理解GC原理的底层逻辑。

    java官方学习文档

    初学者学习文档,适合新手的,可手机安装,在手机上查看相关的功能

    面向GC的Java编程Java开发Java经验技巧共7页

    面向GC的Java编程Java开发Java经验技巧共7页.pdf.zip

    JavaGC调优基础.pdf

    ——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!

    java基础学习笔记 java整合技术 java工具类.rar

    健壮性:java的健壮性与自动垃圾回收机制有关,自动垃圾回收机制简称GC机制,java语言运行过程中产生的垃圾是自动回收的,不需要程序员关心。 可移植性:java程序可以做到一次编译,到处运行。在Windows操作系统上...

    【java】10分钟,了解GC过程

    【java】10分钟,了解GC过程

    Java full gc触发情况实例解析

    主要介绍了Java full gc触发情况实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java基础学习JVM中GC的算法

    主要介绍了java基础学习JVM中GC的算法,通过图文加深对GC算法思路的理解。

    成为JavaGC专家上(3)—深入浅出Java垃圾回收机制

    本文是成为JavaGC专家系列文章的第三篇。在第一篇《》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响?在第二篇《》,...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    深入理解JVM&G1GC

    《深入理解JVM & G1 GC》主要为学习Java语言的学生、初级程序员提供GC的使用参考建议及经验,着重介绍了G1 GC。中国的软件开发行业已经有几十年了,从目前的行业发展来看,单纯的软件公司很难有发展,目前流 资源太...

    深入学习JAVA GC日志的相关知识

    JVM 在Java应用程序优化中是不可缺少的一大重项,如何合理配置Java参数,如何验证配置参数的有效性,从GC日志中可以获得很重要的提示。下面小编就带大家来一起学习一下吧

    corejava的学习笔记

    -verbose[:class|gc|jni] enable verbose output -version print product version and exit -version:<value> require the specified version to run -showversion print product version and continue -jre-...

    深入Java虚拟机JVM类加载学习笔记

    深入Java虚拟机JVM类加载学习笔记:jvm java classloader 垃圾回收 gc

    java虚拟机学习

    对jvm进行深入的讲解,作为java深入学习不可或缺的学习资料。 对JMM、类加载、GC等进行了详细的讲解

    JAVA-JVM-全面/发展史/GC.zip

    最全面的JAVA学习笔记

    Java学习笔记

    Java 到底有哪些优势? 1.跨平台(平台=OS) 可移植性 在不同的操作系统之上可以...gc 内存回收清理 Java 中的回收机制: 零引用回收 问题: System.gc(); Runtime.getRuntime().gc(); 调用gc 的下一行是否回收?不一定

Global site tag (gtag.js) - Google Analytics