Java垃圾回收机制学习心得

本文章是我在学习Java垃圾回收机制中总结的知识点的整理,在此特别感谢http://www.cnblogs.com/andy-zcx/p/5522836.html和http://blog.csdn.net/zsuguangh/article/details/6429592的博客。


  • 内存泄漏:内存泄漏是指内存空间使用完毕后未进行回收操作。一般来说,Java中的内存泄漏是因为内存对象生命周期超出其在程序中存在的时间长度

    • 垃圾回收意义:解决编程时需要考虑的内存管理问题,有效解决内存泄漏问题,充分利用空闲内存空间。Java对象不再有作用域的概念,只有对象的引用才具有作用域。
  • 基本操作:(1)发现无用对象;(2)回收无用对象占用的空间,并且释放成程序可以再次使用的空间。
  • 回收时间:垃圾回收具体发生的时间具有不可预知性,大体上说来具有两种时机:
    1. 编程人员调用JVM的GC接口,但是仅仅只是告知系统想要进行垃圾回收,具体时间由系统决定;
    2. 当程序运行时如果需要大块内存,而此时无法提供足够大的块,则系统会调用GC进行垃圾回收。
  • 回收算法
  1. 引用计数法

    • 内容:每个对象在被创建时,将该对象实例分配给一个变量(称为引用计数器),变量计数初值设为1,当该对象被引用时,计数值加1,当一个对象实例的某个引用超过生命周期或者被设为其他值时,引用计数器减1。当引用计数器值变为0时,可以被当作垃圾回收。(注:该对象实例也可能引用了其他对象,因此当该对象被回收时,它引用的所有对象的计数器都要减1.)
    • 评价:可以较快地执行,在实时系统下比较方便,但是无法解决循环引用问题。例如,对象a和对象b互相引用,但是a和b的值被赋为null,此时a、b引用的对象已经无法被访问,但是它们互相引用,导致其引用计数器的值均不为0,此时GC永远不会回收它们。
  2. 根搜索算法
    • 内容:将程序中所有的引用关系当作图,从根节点GC Root对象开始,寻找对应引用的节点,依次类推,所有的引用节点构成一张图,其余的节点则认为是未被引用的节点,即无用节点。

      Java中用作GC Root对象的有:Java虚拟机栈中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中引用的对象

  3. 标记-清除算法
    • 内容:从根集合进行扫描,标记存活对象,全部扫描后再扫描未被标记的对象,进行回收。
    • 评价:不需要移动对象,只处理不存活对象,当存活对象较多时比较高效,但是会造成内存碎片。
  4. 标记-整理算法
    • 内容:在算法3的基础上,回收完无用对象后,会将所有存活对象向空闲空间移动,整理空闲内存。
    • 评价:开销成本增加,但是解决了碎片化问题。
    • 注:算法3、4、5均属于根搜索算法,此处分开描述是为了便于理解。
  5. copying算法
    • 内容:将内存分为对象区域面和空闲区域面,在对象区进行扫描,然后将对象区的所有有效节点依次copy到空闲区,释放原对象区,此时原对象区变为空闲区。在对象区和空闲区的切换中完成垃圾回收。
    • 评价:减少了句柄的回收,同时不会出现碎片,但是在切换过程中程序需要暂停。
  6. 分代算法
    • 内容:基于不同对象生命周期不一样,将对象分代(共分为三代:新生代、年老代、持久代)处理。
    • 新生代:
      • 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
      • 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。
      • 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收
      • 新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)
    • 年老代:
      • 在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
      • 内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。
    • 持久代:
      • 用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响
时间: 2024-10-22 21:10:32

Java垃圾回收机制学习心得的相关文章

Java 垃圾回收机制学习

原文链接: http://blog.csdn.net/zsuguangh/article/details/6429592 自己学习总结: 1c++和java的内存使用的区别: 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾. 2: 触发主GC(Garbage Collector)的条件 1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用.因为GC在优先级最低的线程中进

成为Java GC专家(3)—如何优化Java垃圾回收机制

本文作者: ImportNew - 王晓杰 未经许可,禁止转载! 本文是成为Java GC专家系列文章的第三篇.在第一篇<成为JavaGC专家Part I — 深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响. 在第二篇<成为JavaGC专家Part II — 如何监控Java垃圾回收机制>,我解释了JVM实际上是如何执行垃圾回收的,我们如何监控GC,以及

成为JavaGC专家(2)—如何监控Java垃圾回收机制

本文作者: ImportNew - 王晓杰 未经许可,禁止转载! 本文是成为Java GC专家系列文章的第二篇.在第一篇<深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响. 在本文中,我将解释JVM到底是如何执行垃圾回收处理的. 什么是GC监控? 垃圾回收收集监控指的是搞清楚JVM如何执行GC的过程,例如,我们可以查明: 1.        何时一个新生代中的对象被移

Java垃圾回收机制(转)

原文链接:Java垃圾回收机制 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃.当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用.事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片.由于创建对象和垃圾回

Java 垃圾回收机制(早期版本)

Java 垃圾回收机制在我们普通理解来看,应该视为一种低优先级的后台进程来实现的,其实早期版本的Java虚拟机并非以这种方式实现的. 先从一种很简单的垃圾回收方式开始. 引用计数 引用计数是一种简单但是速度很慢的垃圾回收技术. 每个对象都含有要给引用计数器,当有引用连接至对象时,引用计数+1. 当引用离开作用域或者被置为null时,引用计数-1. 当发现某个对象的引用计数为0时,就释放其占用的空间.   这种方法开销在整个程序生命周期中持续发生,并且该方法有个缺陷,如果对象之间存在循环引用,可能

Java垃圾回收机制的工作原理

Java垃圾回收机制的工作原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.Java中引入垃圾回收机制的作用 当我们建完类之后,创建对象的同时,进行内存空间的分配,为了防止内存空间爆满,java引入了垃圾回收机制,将不再引用的对象进行回收,释放内存,循环渐进,从而防止内存空间不被爆满. 1.垃圾回收机制的工作原理 创建的对象存储在堆里面,把堆比喻为院子中的土地,把对象比喻为土地的管理者,院子比喻为java虚拟机,当创建一个对象时,java虚拟机将给

Java深度历险(四)——Java垃圾回收机制与引用类型

Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题.一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果.开发人员有可能忘记显式的调用释放内存

Java垃圾回收机制以及内存泄漏

原文地址 前言 在segmentfault上看到一个问题:java有完善的GC机制,那么在java中是否会出现内存泄漏的问题,以及能否给出一个内存泄漏的案例.本问题视图给出此问题的完整答案. 垃圾回收机制简介 在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据.如果只是不停的分配内存,那么程序迟早面临内存不足的问题.所以在任何语言中,都会有一个内存回收机制来释放过期对象的内存,以保证内存能够被重复利用. 内存回收机制按照实现角色的不同可以分为两种,一种是程序员手动实现内存的释放

Java垃圾回收机制--入门

Java垃圾回收机制(gc) 在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据.如果一味的去占用内存而不释放,则会遇到内存溢出的问题. 在程序运行的过程中,gc会用引用计数法去统计对象被多少其他对象持有,如果对象已经没有被引用,那么该对象转变为可复活状态 (对于gc线程来说对象有三种状态: 1.     可触及状态:程序中还有变量引用,那么此对象为可触及状态. 2.     可复活状态:当程序中已经没有变量引用这个对象,那么此对象由可触及状态转为可复活状态.CG线程将在一定的