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

[学习] JAVA GC一些内容

    博客分类:
  • Java
阅读更多

1、堆(Heap)

JVM管理的内存叫堆。在32Bit操作系统上有1.5G-2G的限制,而64Bit的就没有。

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1G。

JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4但小于1G。

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。  
默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio=指定。

服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。   

 

简单的来说,java内存分为堆和盏。堆和盏的数据结构,请百度一下,堆像座古巴比伦空中花园的金字塔。而盏就是一个后进先出的一个队列。

 

其中,堆里面存放所有java的对象,而盏里面存放所有的变量和指针。

 

2、分代 
    分代是Java垃圾收集的一大亮点,根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent,根据不同代的特点采用不同的收集算法,扬长避短也。
 
Young(Nursery),年轻代。研究表明大部分对象都是朝生暮死,随生随灭的。因此所有收集器都为年轻代选择了复制算法。
    复制算法优点是只访问活跃对象,缺点是复制成本高。因为年轻代只有少量的对象能熬到垃圾收集,因此只需少量的复制成本。而且复制收集器只访问活跃对象,对那些占了最大比率的死对象视而不见,充分发挥了它遍历空间成本低的优点。

  1. Young(年轻代)
    年 轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区 (两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一 个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关 系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空 的。
  2. Tenured(年老代)
    年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。
  3. Perm(持久代)
    用 于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等, 在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。

 

gc分为full gc 跟 minor gc,当每一块区满的时候都会引发gc。

  1. Scavenge GC 
    一般情况下,当新对象生成,并且在Eden申请空间失败时,就触发了Scavenge GC,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。
  2. Full GC 
    对整个堆进行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此应该尽可能减少Full GC。有如下原因可能导致Full GC:
    • Tenured被写满
    • Perm域被写满
    • System.gc()被显示调用
    • 上一次GC之后Heap的各域分配策略动态变化

也就是说,一般情况下,jvm不会主动地进行GC操作的。

 

3、关于垃圾收集器

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的由来)。

3.2、基本收集算法 

   1. 复制:将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。
      因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。
   2. 标记清除(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。
   3. 标记整理(mark-sweep-compact):综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块

 

refer to:http://blog.csdn.net/haitao111313/article/details/7951664

http://guoliangqi.iteye.com/blog/630692

 

 

分享到:
评论

相关推荐

    Java程序员必须了解的GC工作原理

    Java程序员在进行内存管理时,垃圾收集(Garbage Collection, GC)是一个不可或缺的部分。理解GC的工作原理对于优化程序性能、防止内存泄漏以及提高系统稳定性至关重要。这篇文章将深入探讨Java中的垃圾收集机制,...

    Java GC 专题

    Java提供了一些工具来帮助开发者分析和调优GC,如VisualVM、JConsole、JMX和JFR(Java Flight Recorder)。这些工具可以显示GC活动的实时信息,包括GC事件的频率、持续时间和内存使用情况,帮助我们诊断潜在问题。 ...

    Java GC的副本.pptx

    【Java GC机制详解】 Java垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)的核心特性之一,它负责自动管理程序运行时的内存,有效地避免...因此,深入学习Java GC机制对于任何Java开发者来说都是必备的技能。

    jvm 参数及gc详解

    Java虚拟机(JVM)是Java...阅读“java hotspot vm options.pdf”、“java se 6 hotspot[tm] virtual machine garbage collection tuning.pdf”和“java工具选项文档.pdf”等资料,将有助于深入学习和实践这些知识。

    学习java必看

    "学习Java必看"这个压缩包文件显然包含了一系列与Java学习相关的资源,可能是教程文档、代码示例或者教学视频,旨在帮助初学者和有经验的开发者深化对Java的理解。以下是基于这个主题的Java知识点详细说明: 1. **...

    成为JavaGC专家(4)

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

    JVM GC原理深入学习.pdf

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

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

    以上内容只是面向GC的Java编程的一部分,实际开发中还需要结合具体的应用场景,深入理解JVM的工作原理,才能更好地优化Java应用程序。在日常学习和工作中,不断积累和实践,才能成为一名优秀的Java开发者。

    java gc调优

    Java垃圾收集(Garbage Collection, 简称GC)是Java平台中的一项重要特性,它自动管理程序的内存,使得开发者...通过学习这个PPT,开发者可以深入理解JVM内存管理,掌握GC调优的技巧,从而更好地优化Java应用的性能。

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

    深入学习JAVA GC日志的相关知识 本资源摘要信息主要介绍了 Java GC 日志的相关知识,包括 JVM 中的垃圾收集、GC 日志的分析、虚拟机参数的解释、jmap 分析等内容。 JVM 中的垃圾收集 Java 虚拟机(JVM)是一个...

    Java SE编程入门教程 java GC(共6页).pptx

    这些Java SE编程入门教程涵盖了从基础的变量和数据类型,到面向对象的特性,如类和对象、继承、封装和多态,再到高级主题如垃圾回收和内存管理,为学习Java编程提供了全面的指导。通过深入理解和实践这些概念,初学...

    corejava学习笔记

    在学习Java时,遵循"多花时间、多动手、多问题"的原则至关重要,因为理论理解与实践操作相结合能更好地掌握知识。 1. **Java语法与基本规则** - Java语法严谨,包括变量声明、数据类型、运算符、流程控制等。学习...

    java学习体系

    在这个体系中,不仅包括Java编程语言的核心知识,还涉及开发工具、开发环境、项目构建、数据库、中间件、性能优化等多个方面的内容。下面将详细解析这些知识点: 1. Java基础:Java的基础知识包括Java的数据类型、...

    java培训内容

    其次,深入学习Java源码是提升技术水平的重要步骤。阅读并分析Java的开源项目,如Spring框架、Apache Commons库等,能让你了解设计模式、并发编程、IO流、网络编程等复杂主题。源码阅读不仅可以提高编程技能,还能让...

    java深入学习

    在Java编程语言的世界里,深入学习意味着要对基础概念有透彻的理解,特别是关于对象与引用以及垃圾回收机制这两个核心话题。本文将详尽探讨这两个关键知识点。 首先,我们来探讨"对象与引用"的关系。在Java中,对象...

    自己的系统的gc参数学习

    总结,学习和理解GC参数,尤其是G1垃圾收集器的配置,对于优化Java应用的性能至关重要。通过对gc.log的分析,我们可以了解系统的内存使用状况,调整参数以满足特定的性能需求,如降低暂停时间或提高吞吐量。同时,...

    Java高级编程核心内容讲解大全

    通过全面学习以上内容,你将能够掌握Java的高级编程技巧,从而在实际项目中游刃有余。侯捷的《java反射机制》.pdf是一个很好的起点,它将引导你深入理解Java反射的奥秘,而其他高级主题的学习则需要不断实践和探索。

Global site tag (gtag.js) - Google Analytics