【第四期】GC专题

我在某个技术群里发现很多人对GC的问题是最多的。确实,由于Java的GC经常会刷存在感(例如占用大量的CPU时间,full gc时直接失去响应),GC的问题就成了初级的Java程序员向中级程序员进步过程中不得不面对的一个问题。但是到目前为止,我还没有在网上看到一个系统的全面的针对Java GC进行总结的文章。我希望在我的公众号里专门针对Java GC做一下梳理。

这一期,我们先从Java的分代式GC讲起。

垃圾回收(Garbage Collection,GC),本质上是一种自动内存管理技术。我们知道在C或者C++语言中,内存的申请和释放是要通过程序员手动操作的,而在Java中,则不必这样做。这是因为Java语言可以自动GC。GC的意思是把不用的内存回收掉。

把分配到堆中那些不能通过程序引用的对象称为非活动对象,也就是死掉的对象,我们称为“垃圾”。因为我们期望让内存管理变得自动,我们就必须做两件事情: 1. 找到内存空间里的垃圾;2. 回收垃圾,让程序员能再次利用这部分空间 。只要满足这两项功能的程序,就是GC。不一定非得说是在某种语言的runtime里实现的才叫GC。(这句话的意思是,你完全可以自己为C++写一个内存管理模块,以第三方库的形式接管C++的内存申请和释放,这也是GC)

Java程序中的各个object之间的引用关系是一个带有明显方向性的关系。例如下面的例子:

public class Main {
    public static void main(String args[]){
        try {
            A a = new A();
            a.b = new B();
            a.c = new C();

            a.b.a = a;
            a.b.c = a.c;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class A {
    public B b;
    public C c;
}

class B {
    public A a;
    public C c;
}
class C {
    Runnable r;
}

我们创建了三个对象,如果某一个对象 x 引用了另一个对象 y,那我们就通过一条有向边把这两个对象的引用关系表示出来,那么上述程序就可以表示成:

大家可以看到,我们经过这样的抽象以后,就把对象之间的引用关系转换成了一个有向图。如果我们在原来的逻辑上,再增加一行语句:

  a.refB = new B();

这时,从 a 到 b 的引用就不存在了,而是转向了另外一个 B 的实例。那么这个 b 就不再被任何对象引用了,就可以标记为垃圾了(实际上,在这个例子中还是有一些细微的差别的,b并不会直接变成垃圾,这是因为从当前程序栈上还有一个指向b对象的隐含的引用。我们现在不必在意这些细节,以后会慢慢细化)

我们已经把对象之间的引用关系转换成了一个有向图,那么我们就可以使用图算法来处理内存管理领域的一些问题了。

原文发布于微信公众号 - HinusWeekly(gh_4b8b4eda4e40)

原文发表时间:2018-01-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

第一个 C 语言编译器是怎样编写的?

作者: 伯乐在线 - Chaobs 网址: http://blog.jobbole.com/94311/ 首先向C语言之父Dennis Ritchie致敬! ...

4249
来自专栏我杨某人的青春满是悔恨

Swift API 设计指南(上)

本文翻译自苹果官方文档:Swift API Design Guidelines,如有错漏,欢迎指出。

1133
来自专栏更流畅、简洁的软件开发方式

面向对象的本质是什么?

  什么是面向对象的本质呢?   万物皆对象?No   抽象?No   复用?No   那到底是什么呢? 万物皆对象。问了几位网友,这是答复之一。看到了某个...

3679
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day08-超市购物系统总结

Java基础-day08-超市购物系统总结 超市购物小票——自定义类 1案例介绍与演示 将超市购物小票案例中零散数据(名称、货号、单价、计价单位等)封装为货物对...

5156
来自专栏王亚昌的专栏

C++多线程编程学习二 [类中封装互斥量的设计]

      之前我也提到过,如果一个类的数据成员中在多线程环境中可能会被竞争使用时,一定要在类中解决这个问题,而不是在代码编写过程中在每次使用时去申请或释放,这...

831
来自专栏一个番茄说

让你的编译器更懂你,写出更棒的Swift

自从Swift诞生以后,苹果就一直在努力让它变得更好,更快。相比更加灵活的Objective-C,Swift显得更加老实本分。但是,如果你真的对它了解之后,你会...

813
来自专栏PHP在线

5个经典的JavaScript面试题

在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司...

3578
来自专栏landv

C语言介绍

4302
来自专栏coding for love

JS进阶系列01-JS的弱类型和动态类型

首先,我们要弄清楚编程语言的两组划分,即弱类型和强类型,动态类型和静态类型。下面有一幅图,非常详细地说明了它们各自的定义和区别。

1283
来自专栏杨建荣的学习笔记

Python代码重构参考

在数据库方向上相对来说能够容易推出开发规范和标准,但是你很少听到公司里面出针对开发同学的开发规范。我觉得其中的一个原因是程序猿比较执拗,以技术服人,经常...

2370

扫码关注云+社区

领取腾讯云代金券