14、Java垃圾回收机制

垃圾回收原理和算法

??Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解。Java程序员可以将更多的精力放到业务逻辑上面,而不是内存管量上面,大大的提高了开发效率。这是因为Java有自动的垃圾回收机制。

内存管理

Java 的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放。
对象空间的分配:使用new送键字创建对象即可。
以象空间的释放:将对象赋值null即可。垃圾回收器将负责回收所有“不可达”对象的内存空间。

垃圾回收过程

任何一种垃圾回收算法一般要做两件基本事情。

1、发现无用的对象。
2、回收无用对象占用的内存空间。

??垃圾回收机制保证可以将“无用的对象”进行回收。无用的对象指的就是没有任何变量引用该对象。Java的垃圾回收器通过相关算法发现无用对象,并进行清除和整理。

垃圾回收的相关算法

1、引用计数法:
??堆中每个对象都有一个引用计数。被引用一次,计数加1,被引用变量值变为null,则计数减1,直到计数为0,则表示变成无用对象。优点是算法简单,缺点是“循环引用的无用的对象“无法识别。
循环引用示例

public class Student{
    String name;
    Student friend;

    public static void main(String[] args){
        Student s1 = new Student();
        Student s2 = new Student();

        s1.friend = s2;
        s2.friend = s1;

        s1 = null;
        s2 = null;
    }
}

??s1和s2相互引用对方,导致它们引用计数不为0,但是实际已是无用对象,但是无法被识别。
2、引用可达法
??程序把所有的引用关系看作一张图,从一个节点GC ROOT 开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。

通用的分代垃圾回收机制

分代垃圾回收机制,是基于这样一个事实:不同的对象的生命周斯是不一样的。因此,不同生命周期的对象可以采取不同的回收算法,可便提高回收效率。我们将对象分为三种状态:年轻代、年老代、持久代。JVM将堆内存划分为 (Eden 、Survivor) (年轻代) 和 (Tenured/Old) (年老代) 空间。

年轻态

所有新生成的对象首先都是放在Eden区,年轻代的目标就是尽可能的快速的收集掉那些生命周期短的以象,对应的是Minor GC,每次Minor GC 会清理年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会浪费内存空间。当“年轻代“区域存放满对象后,就将对象存放到年老代区域。

年老代

在年轻代中经厉了15次垃圾回收后,仍然存活的对象,就会被放到年老代中,因些,可以认为年老代中存放的都是一些生命周期较长的对象。年老代对象越来越多,我们就就要启动 Major GC 和 Full GC (全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。

持久代

持久代用来存放态文件,如Java类,方法等,持久代对垃圾回收机制没有显著影响。还有就是持久代的对象存放在方法区里面。

Minor GC

用于清理年轻年区域,Eden区满了就会触发一次 Minor GC,清理无用对象,将有用对象复制到 Survivor1,Survivor2 区,这两个区域,大小空间也相同,同一时刻只有一个在用,一个为空。

Major GC

用于清理老年代区域。

Full GC

用于清理年轻代、年老代。成本软高,会对系统性能产生影响。

垃圾回收过程

1、新创建一个对,绝大多数都会存储在Eden里面。
2、当Eden满了之后,不能再创建新的对象了,则触发垃圾回收机制 GC ,将无用的对象清理掉,有用的对象复制到Survivor中,比如:S1中,同时清理Eden区。
3、当Eden区再次满了以后,会将S1中不能被清空的对象存放到另外一个Survivor中,比如:S2,同时将Eden区中的不能清空的对象,也复制到S2中,保证Eden和S1,均被清空。
4、重复多次(默认15次)以后Survivor中没有被清理的对象,则会被复制到老年代Old区中。
5、当Old区满了,则会触发一个一次完整地垃圾回收(Full GC)。

JVM 调优和Full GC

在对JVM 调优的过程中,很大一部分工作就是对于 Full GC 的调节。因为Full GC 运行的时候,非常的影响性能,所以我们尽可能的不用调用到这个Full GC。

下面的原因可能导致Full GC:

1、年老代(Tenured)被写满。
2、持久代(perm)被写满。
3、System.gc() 被调用了。
4、上一次GC之后Heap的各域分配策略动态变化。


细节决定成败!

个人愚见,如有不对,恳请扶正!

原文地址:https://www.cnblogs.com/xdtg/p/12359758.html

时间: 2024-10-07 15:41:55

14、Java垃圾回收机制的相关文章

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

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

【Java】Java垃圾回收机制

Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象

Java垃圾回收机制_(转载)

Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?下面我们就来逐一探讨这些问题.以下是本文的目录大纲: 一.如何确定某个对象

【转载】Java垃圾回收机制

原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都 交给了JVM来处理.顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后, 采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的

java 垃圾回收机制 引用类型

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

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

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

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

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

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

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

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

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

Java垃圾回收机制--入门

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