今天粗略的看了下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对暂停时间看得更清晰
。
分享到:
相关推荐
Java程序员在进行内存管理时,垃圾收集(Garbage Collection, GC)是一个不可或缺的部分。理解GC的工作原理对于优化程序性能、防止内存泄漏以及提高系统稳定性至关重要。这篇文章将深入探讨Java中的垃圾收集机制,...
Java垃圾收集(Garbage Collection, 简称GC)是Java编程中的一个重要概念,它自动管理内存,使得程序员不必手动释放不再使用的...通过学习和实践,我们可以更好地管理Java应用的内存,减少性能瓶颈,提升整体系统性能。
【Java GC机制详解】 Java垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)的核心特性之一,它负责自动管理程序运行时的内存,有效地避免...因此,深入学习Java GC机制对于任何Java开发者来说都是必备的技能。
Java虚拟机(JVM)是Java...阅读“java hotspot vm options.pdf”、“java se 6 hotspot[tm] virtual machine garbage collection tuning.pdf”和“java工具选项文档.pdf”等资料,将有助于深入学习和实践这些知识。
在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...
Java垃圾收集(Garbage Collection, 简称GC)是Java平台中的一项重要特性,它自动管理程序的内存,使得开发者...通过学习这个PPT,开发者可以深入理解JVM内存管理,掌握GC调优的技巧,从而更好地优化Java应用的性能。
以下是对"深入理解Java虚拟机学习资料"的详细解析: 一、JVM概述 Java虚拟机是Java平台的核心组成部分,它负责加载、验证、执行Java字节码,并管理内存。JVM的设计目标是实现“一次编写,到处运行”。通过JVM,Java...
这些Java SE编程入门教程涵盖了从基础的变量和数据类型,到面向对象的特性,如类和对象、继承、封装和多态,再到高级主题如垃圾回收和内存管理,为学习Java编程提供了全面的指导。通过深入理解和实践这些概念,初学...
Java官方学习文档是Java开发者和初学者的重要资源,它提供了全面、权威的Java语言和平台规范的解释。这个文档详细介绍了Java编程语言的各种特性和使用方法,帮助新手逐步掌握这门强大的编程工具。以下是根据标题、...
在Java编程中,垃圾收集(Garbage Collection, GC)是一项至关重要的机制,它负责自动管理内存,确保程序的稳定运行。面向GC的编程是优化Java应用程序性能的关键环节,特别是对于大规模系统或者内存敏感的应用,理解...
Java是一种广泛使用的面向对象的编程语言,其基础知识构成了"Core Java"的学习内容。在学习Java时,遵循"多花时间、多动手、多问题"的原则至关重要,因为理论理解与实践操作相结合能更好地掌握知识。 1. **Java语法...
5. JVM内存管理和垃圾回收(GC):Java虚拟机(JVM)是运行Java程序的基础环境,了解JVM的内存管理模型以及垃圾回收机制,对于编写高性能的Java应用至关重要。 6. Java网络编程:Java提供了丰富的网络编程接口,...
同时,为了能更深入理解与之相关的知识点,本文特地编写了“第二章 基础知识”,详细的讲解与GC学习相关的JVM架构、JVM选项、Object内存布局、指针压缩等内容,以便读者能更加清晰的理解GC原理的底层逻辑。
10. **JVM与内存管理**:理解Java虚拟机(JVM)的工作原理,包括类加载机制、垃圾回收(GC)、内存区域划分(如堆、栈、方法区等),以及性能优化技巧。 11. **Java标准库**:深入学习Java的标准库,如util包中的...
这篇“java学习笔记”可能包含了从基础到进阶的各种Java编程概念和技术。以下是对这些笔记可能涵盖的一些关键知识点的详细说明: 1. **Java基础知识**: - **语法**:包括变量声明、数据类型(如整型、浮点型、...
总结,学习和理解GC参数,尤其是G1垃圾收集器的配置,对于优化Java应用的性能至关重要。通过对gc.log的分析,我们可以了解系统的内存使用状况,调整参数以满足特定的性能需求,如降低暂停时间或提高吞吐量。同时,...
在Java编程语言的世界里,深入学习意味着要对基础概念有透彻的理解,特别是关于对象与引用以及垃圾回收机制这两个核心话题。本文将详尽探讨这两个关键知识点。 首先,我们来探讨"对象与引用"的关系。在Java中,对象...
最后,深入学习Java虚拟机(JVM)的工作原理,包括内存管理(堆、栈、方法区等)、垃圾回收(GC)机制,以及性能优化技巧,对于成为一名优秀的Java开发者至关重要。 在实际项目中,你还需要了解Maven或Gradle构建...
### Java学习笔记——Java基础知识整理 #### 一、Java技术入门 Java是一种广泛使用的编程语言,因其跨平台性、安全性和高效性而受到青睐。Java最初由Sun Microsystems开发,并于1995年首次发布。 ##### 1. Sun ...