Java GC 小结

很早就想对Java的GC做点小总结,一直没有时间,最近看了下java paper上的java gc文章,觉得不错,读了读,顺便做下总结。

java paper的GC文章地址,里面有很多java技术文章,写的都不错。

1、Java GC 简介

JVM的垃圾回收机制使开发者不必过多考虑内存的申请与释放,这样降低了软件开发的成本和语言的学习成本。

不同的JVM对GC的实现是不同的,目前Oracle维护着两种JVM,JRockit JVM,HotSpot JVM。

本文讨论的JVM是居于HotSpot的JVM。

1、运行时数据区域

方法区、Heap内存,Java Stack, PC Registers,本地方法栈

(以下图片均来自网络)

2、执行引擎

JIT Compiler, Garbage Collector

2、Heap Memory

在运行时,java对象的实例均被分配在heap内存中。当对象不被引用的时候,会被垃圾回收器标记为eviction,然后回收,最后释放在heamp中所占用的空间。

Java Heap Memory 分为三个区域:

1、Young Generation

1、Eden  任何实例进入运行时的内存区域都是从Eden进入的

2、S0 存活久一点的实例就可以从Eden进入到S0

3、S1 存活更久的实例从S0进入S1

2、Old Generation

tenured (终身制的),实例从S1晋升到终身制区域

3、Permanet Generation

包含元数据信息,如class,method的detail信息

翻译一段来自java paper的Heap介绍:

Eden Space:

每当一个实例被创建,就会分配到eden空间。

Survivor Space (S0 and S1):

作为minor GC的一部分,对象如果还在被引用的,就会从移动到S0.

在minor GC时,如果对象没有被引用了,该对象就会被标记为要驱逐出内存中的对象。

Old Generation:

老年代是heap memory的逻辑部分,当垃圾收集器进行minor GC的时候,S1中还在存活的对象实例将从S1 移动 到 Old, 在S1中失去引用的部分,将被标记为从内存中驱逐。

Major GC:

老年代中的对象在进行Major GC时,那些失去引用的对象将被标记为从内存中驱逐。

Memory Fragmentation:

内存片段:当实例从heap memory中删除时,被删除后内存位置可以供新分配的对象使用,内存碎片需要被整理成连续的空间,内存碎片整理,从而能进行快速的分配内存空间。

在驱逐对象实例和恢复内存空间之前,要对对象实例调用finalize()方法来对 该对象实例持有的资源进行释放。

尽管finalize()方法一定在恢复内存空间前执行,但是顺序是无序的,是没有规定时限的。对象多实例之间的释放顺序不能提前决定,它们甚至可能是并行的进行。

3、GC 过程

Young 和 Old 的关系是 晋升关系

联想起来,其实可以这样打个比方,就是学生上学的场景:

Heap Memory中的GC就是上学的问题。

我们把这几个区域比作学校。实例比作学生。

Young

Eden    S0    S1

小学    初中  高中

Old

大学

Permanet

学生元信息库

描述GC的过程就很通俗易懂啦。

判断是否晋升,是否标记释放,可以用reference来判断。那么:

still referenced  仍然被引用的 (就是仍然愿意学习学生)

dereferenced  失去引用的(就是不愿意学习的学生)

MinorGC:(发生在Young内)

1、比如一个学生刚上学,那么他肯定首先分配到小学,即Eden。

2、如果在小学里还想继续学习的学生,即still refernced的学生,就会晋升到初中S0进行学习。不想学习的学生,即dereferenced 会被标记为毕业,会被垃圾回收。

3、如果在初中里还想继续学习的学生,即still refernced的学生,就会晋升到高中S1进行学习。即dereferenced 会被标记为毕业,会被垃圾回收。

MajorGC:(发生在Old)

当在高中毕业后S1,还想继续学习的,那么就会被晋升到大学Old。

发生MajorGc时,Old中会回收失去引用的实例,还被引用的将不被回收,还在Old大学里继续学习。当大学里装的学生太多了,就会触发OutOfMemoryError了。

(以下图片来自网络)

4、对象的回收

什么情况下对象会被回收?

Strong Reference     Not eligible for garbage collection  - 强引用的对象实例不会被回收

Soft Reference     Garbage collection possible but will be done as a last option - 软引用的对象实例可能会被回收,但是一定是在不得不回收的情况下才回收。

Weak Reference     Eligible for Garbage Collection - 弱引用的肯定会被回收

Phantom Reference     Eligible for Garbage Collection - 幽灵引用的肯定会被回收

1、声明后从来都没使用的对象,编译器会自动给该对象置为null,会被编译器标记为eviction。

编译器会将那么不会在后续使用的对象,在运行时之前提前将其提前回收。

2、典型的一个例子,一个实例的所有属性都存在register中,访问实例的属性值是从register中读取的,如果这个实例在未来不会将属性值写回实例,那么该实例还是会被标记为驱逐。

3、null值赋给实例,如果该实例没有其它实例的引用,则会被标记回收。

4、当finalize方法被调用,JVM会释放在那个线程的所有同步锁。

5、总结

JVM是一套标准,有很多种实现,我们最常接触的是HotSpot JVM,对于不同的JVM,垃圾回收器的实现也不同。

JVM中主要是分为运行时数据区域 和 执行引擎。

Heap Memory中被划分为Eden,S0,S1,Old,Perm

GC的过程就是这Eden到S0,S0到S1,S1到Old的晋升过程,分为minorGC 和 MajorGC(FullGc)。

强引用对象不会被垃圾回收,软引用一般情况下不会被回收,实在不能回收时最后才会被回收。 弱引用和幽灵引用的都会被回收。

——EOF——

原创文章,转载请注明出自:http://blog.csdn.net/oopsoom/article/details/40348125

时间: 2024-11-04 16:04:31

Java GC 小结的相关文章

java gc小结

java的内存结构: 1. 堆: java所有通过new新建的对象都是在堆上进行分配的; 根据不同的垃圾回收算法, 堆的结构也不相同, 如果采用的是分代垃圾回收, 那么堆就分为年轻代和年老代两部分. 2. 栈: 每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量.参数和中间结果 3. 本地方法栈: 用于存放native方法的执行状态 4. 方法区: 存放了已加载的类信息.静态变量.final类型的常量.属性和方法信息以及JIT

面试官,不要再问我“Java GC垃圾回收机制”了

Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解>中有些内容我们没有讲,本篇结合垃圾回收机制来一起学习.还记得JVM中堆的结构图吗? 图中展示了堆中三个区域:Eden.From Survivor.To Survivor.从图中可以也可以看到它们的大小比例,准确来说是:8:1:1.为什么要这样设计呢,本篇文章后续会给出解答,还是根据垃圾回收的具体情况来设计的.

jvm系列:Java GC 分析

Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定

java枚举小结

在百度百科上是这样介绍枚举的: 在C#或C++,java等一些计算机编程语言中,枚举类型是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中,它是一种构造数据类型.枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型. 而在java中,枚举扩大了这一概念,因为在java中,枚举已经称为一个类,因此完全具有类的特性. 我们都知道枚举是JDK1.5才推出的新概念,那么在此之前,我们如果想使用一些固定的常量集合,比如性别(2个),季节(4个),星期(7个)

JAVA GC 简单总结

GC分代 GC的英文全拼是Garbage Collection,意思是垃圾收集. Java 将堆内存分为三代来管理: - 年轻代 (Young Generation) - 年老代 (Old Generation) - 永久代 (Perm Generation) 年轻代:又分为Eden.From和To,其中From和To又统称为Survivor Spaces(幸存区).年轻代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例,使用–XX:Ne

java加密算法小结(2)--MD5加密算法

上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇来整理一下一个被广泛应用的加密算法---MD5. 简单了解 MD5(Message Digest Algorithm 5),翻译过来是消息摘要算法第五版,按照惯例,我们推理可能也有MD2,MD3这样名字的历史版本.. 即使完全不了解这个算法的原理,我们也可以从命名中看出一些眉道,所谓摘要,就是一个简短的概括,像我写过的毕业论文,上来第一部分就是摘要,它对后面长篇大论的文章做了一个简短有力的概

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

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

java加密算法小结--MD5加密算法

上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇来整理一下一个被广泛应用的加密算法---MD5. 简单了解 MD5(Message Digest Algorithm 5),翻译过来是消息摘要算法第五版,按照惯例,我们推理可能也有MD2,MD3这样名字的历史版本.. 即使完全不了解这个算法的原理,我们也可以从命名中看出一些眉道,所谓摘要,就是一个简短的概括,像我写过的毕业论文,上来第一部分就是摘要,它对后面长篇大论的文章做了一个简短有力的概

成为Java GC专家(4)—Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响

本文作者: ImportNew - 王晓杰 未经许可,禁止转载! 这是“成为Java GC专家系列文章”的第四篇. 在第一篇文章 成为JavaGC专家Part I — 深入浅出Java垃圾回收机制 中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何. 在第二篇文章 成为JavaGC专家Part II — 如何监控Java垃圾回收机制 中我们学到了JVM到底是如何执行垃圾回收,我们如何监控GC,以及那些工具可以使得监控