Java垃圾回收(GC)机制详解

垃圾回收算法有两种,根据不同的虚拟机策略不同

1、引用计数法 2、可达性分析法

由于我们平常使用的hotspot虚拟机用的是第二种。

那哪些是可达的呢?

这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。在Java语言中可以作为GC Roots的对象包括:

· 虚拟机栈中引用的对象

· 方法区中静态属性引用的对象

· 方法区中常量引用的对象

· 本地方法栈中JNI(即Native方法)引用的对象

垃圾回收算法

1、标记-清除(Mark-Sweep)算法

2、复制(Copying)算法

3、标记-整理(Mark-Compact)算法

分代收集

根据上面的内容,用一张图概括一下堆内存的布局

这里解释一下为什么有From Survivor和To Survivor。

垃圾收集器的联系如下图:

最新的垃圾收集器是G1

G1收集器

G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一,JDK 7 Update 4后开始进入商用。在G1收集器之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1收集器不再是这样,使用G1收集器时,Java堆的内存布局就与其他收集器有很大差别,它将整个Java堆分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region的集合。G1收集器跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也是Garbage-First名称的由来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高的收集效率。

时间: 2024-08-27 23:02:24

Java垃圾回收(GC)机制详解的相关文章

Java垃圾回收与算法详解

首先来张祖传的思维导图: 内存回收与垃圾收集器在很多时候都是影响系统性能.并发能力的主要因素,虚拟机之所以提供多种不同的收集器以及提供大量的调节参数,是因为只有根据实际应用需求.实现方式选择最优的垃圾收集方式才能获得最好的性能. GC发生在那里: JVM虚拟机运行时内存区域主要分为(如下图):虚拟机栈.本地方法栈.程序计数器.Java堆.方法区.其中虚拟机栈.本地方法栈.程序计数器为线程私有区域,在这几个区域中就不需要过多的考虑垃圾回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了.而

Java 垃圾回收(GC) 泛读

Java 垃圾回收(GC) 泛读 文章地址:https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要的疑惑在于这么几点: 为什么需要 GC ? 虚拟机(JVM) 与 垃圾回收(GC) 的关系? GC 的原理有哪些? 哪些 对象容易被 GC ? 等等 带着这些问题往下看: 1. 为什么需要 GC ? GC: 是Garbage Collection 的英文缩略,垃圾收集的意思. 为什么需要 GC?主要

java 深拷贝与浅拷贝机制详解

 java 深拷贝与浅拷贝机制详解            --摘自-https://www.jb51.net/article/106088.htm 概要: 在Java中,拷贝分为深拷贝和浅拷贝两种.java在公共超类Object中实现了一种叫做clone的方法,这种方法clone出来的新对象为浅拷贝,而通过自己定义的clone方法为深拷贝. (一)Object中clone方法 如果我们new出一个新对象,用一个声明去引用它,之后又用另一个声明去引用前一个声明,那么最后的结果是:这两个声明的变量将

从C#垃圾回收(GC)机制中挖掘性能优化方案

GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实用的东西.关于概念和理论这里只做简单说明,具体的大家可以看微软官方文档. 一.什么是GC                                                                                              GC如其名,就是垃圾收集

java 动态性之反射机制 详解 案例

1.反射机制 2.动态编译 3.动态执行javassript代码 4.动态字节码操作 动态语言 程序运行时,可以改变程序结构或变量类型.典型的语言: 1):Python.ruby.javascript等. 2):如下javascript代码: funtion test(){ var s ="var a=3;var b=5;alert(a+b);"; eval(s); } 3):C,C++,JAVA不是动态语言,JAVA可以称之为"准动态语言".但是JAVA有一定的动

java垃圾回收GC

垃圾回收时,暂停虚拟机运行 基础假设:大部分对象只存在很短的时间 对于新生代,Minor GC经常会发生 Major/Full GC会对老生代做GC 老生代GC采用Compact算法,移动形成完整的空余区 垃圾回收在什么时候发生? 如果内存满了,内存分配失败时运行:调用system.gc()时运行. 对什么对象进行回收? 从根节点出发,对不可达对象进行回收. 垃圾回收根节点 局部变量 静态变量 Native方法引用的对象 活动线程,等待中的Monitor(wait.notify.synchron

Java垃圾回收-GC

判定对象是否属于垃圾: 判断对象的引用数量 通过判断对象的引用数量来决定,是否被回收,引用数量=0,被当做垃圾处理 每个对象实例,都有一个引用计数器,被引用+1,完成引用-1 优点:执行效率高,程序执行影响较小 缺点:无法检测循环引用的情况,导致内存泄露 可达性分析算法 通过判断对象的引用链是否可达,来决定对象是否可以被回收 可以作为GC Root的对象,如下: 虚拟机栈中引用的对象(栈帧中的本地变量表) 方法区中常量引用的对象 方法区中的类静态属性引用的对象 本地方法栈中的Native方法的引

java的动态代理机制详解

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于 Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是 java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Cla

(转)java的动态代理机制详解

原文出自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有

[转载] java的动态代理机制详解

转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理