很长时间,我想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

Java GC 概念摘要的更多相关文章

  1. Java GC回收机制

    优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...

  2. 应用JConsole学习Java GC

    应用JConsole学习Java GC 关于Java GC的知识,好多地方都讲了很多,今天我用JConsole来学习一下Java GC的原理. GC原理 在我的上一篇中介绍了Java运行时数据区,在了 ...

  3. Java GC专家系列1:理解Java垃圾回收

    了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌 ...

  4. jvm系列(十):如何优化Java GC「译」

    本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...

  5. 性能测试系列-java gc调优

    性能测试中除了需要做好性能测试外,我们还需要做性能测试后的,性能调优,需要发现性能问题,也需要做性能调优,在做性能调优中,jvm的性能调优是经常遇到的一个. 随着jdk版本的迅速变化,jdk里面的GC ...

  6. java GC是在什么时候,对什么东西,做了什么事情

    面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?” 面试题目:地球人都知道,Java有个东西叫垃圾收集器,它让创建的对象不需要像c/cpp那样delete.free掉,你 ...

  7. [Java基础]-- Java GC 垃圾回收器的分类和优缺点

    https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 参考:elasticsearch实战-使用G1 ...

  8. Java分层概念(转)

    Java分层概念(转) 对于分层的概念,似乎之间简单的三层,多了,就有点难以区分了,所以收藏了这个. ervice是业务层 action层即作为控制器 DAO (Data Access Object) ...

  9. jvm系列(七):如何优化Java GC「译」

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章 ...

随机推荐

  1. 阿里云centOS6 下python安装及配置、pip安装及配置、ipython安装及配置

    我是在阿里云服务器上进行的python环境搭建,阿里云服务器会自带python但是版本低,所以打算自己安装一个,期间遇到各种问题,而且百度根本不够用无奈上的外网很快解决了.在此分享一下. 一.pyth ...

  2. ASP.NET State Service服务

    ASP.NET State Service服务是用来管理 Session 的,正常来说,Session 位于IIS进程中(其实可以理解成在服务器的内存中),当IIS重启或程序池回收会自动清空Sessi ...

  3. using namespace std

    using namespace std std 是一个命名空间..不同的命名空间可以有相同的类名被定义 ..using namespace std;就是指明下面的程序使用std,如果不用这句指明的话就 ...

  4. complex(x):创建一个复数

    使用python可以实现将一个整数或者浮点数转换为一个复数: 演示如下: >>> # 演示复数函数:complex(x) ... >>> x = complex(1 ...

  5. php 文件上传 以及保存在本地的乱码问题处理

    要知道两点: ①浏览器传到PHP程序中是UTF-8编码 ②PHP程序保存上传的文件,要转换成GBK编码才保存在本地中,否则如果直接使用浏览器传过来的文件名保存在本地,会出现文件名乱码. <?ph ...

  6. .net 利用 GZipStream 压缩和解压缩

    1.GZipStream 类 此类在 .NET Framework 2.0 版中是新增的. 提供用于压缩和解压缩流的方法和属性 2.压缩byte[] /// <summary> /// 压 ...

  7. Custom ASP.NET Application into SharePoint --整合ASP.NET应用程序到SharePoint

    转:http://www.devexpertise.com/2009/02/18/integrating-a-custom-aspnet-application-into-sharepoint-par ...

  8. DevExpress右键菜单使用 zt

    添加BarManager和popupMenu组建: 设置popupMenu组件的Manager属性: 右键点击popupMenu主键,点击Customize选项添加菜单:   然后便可添加到鼠标事件中 ...

  9. PCB的技巧

    (1)首先元件的移动,如下图中,向让D1的2引脚和R49的2引脚齐平,但是移动的距离每次都超过,不能平齐 修改元件最小移动距离即可,如下图,其中有很多可以改动的地方,但是需要改的是Component ...

  10. 理解C++11正则表达式(2)

    今天有幸(2016/3/19)在上海参加了C++交流会,见到了梦寐已久想见的台湾C++大神老师侯捷,心情十分的激动.侯老师对C++理解的深刻,让人叹为观止.以为他教学的严谨,说话方式娓娓道来,听着非常 ...