Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Garbage Collection #38

Open
wangning0 opened this issue Aug 29, 2017 · 0 comments
Open

Garbage Collection #38

wangning0 opened this issue Aug 29, 2017 · 0 comments

Comments

@wangning0
Copy link
Owner

垃圾回收

GC的定义

GC 是 Garbage Collection的简称,也就是垃圾回收

垃圾的回收

在GC中,垃圾指的是程序不用的内存空间

GC主要做的两件事:

  • 找到内存空间的垃圾
  • 回收垃圾,让程序员再次利用这部分空间

算法篇

GC的基本概念

  • 对象/头/域

    在GC的世界里,对象表示的是通过应用程序利用的数据的集合

    对象配置在内存空间里,GC把配置好的对象进行移动或销毁操作,因此,对象是GC的基本单位。

    一般来说,对象由构成

    • 将对象中保存对象本身信息的部分称为”头“

      • 对象的大小
      • 对象的种类

      如果不清楚对象的大小和种类,就会发生问题,无法判别内存中存储的对象的边界等

      对于不同的GC算法,头里面提供的信息也是不同的

    • 对象使用者在对象中可访问的部门称为“域”,对象使用者会引用或替换对象的域值。另一方面,对象使用者基本上无法直接改变头的信息

      域中的数据类型大致分为以下两种

      • 指针
      • 非指针

      image

  • 指针

通过GC,对象会被销毁或保留,这时候起到关键作用的就是指针,因为GC是根据对象的指针指向去搜寻其他对象的,GC对于非指针不进行任何操作

指针如果指向的对象首地址以外的部分,GC就会变得非常复杂,在大多数语言处理程序中,指针都默认指向对象的首地址

image

B和C称为A的子对象,对某个对象的子对象进行某项处理是GC的基本操作

  • mutator

    mutator,是“改变某物”的意思,那要改变什么呢? 那就是GC对象间的引用关系,它的实体就是“应用程序”
    mutator进行的实际操作:

    • 生成对象
    • 更新指针

    mutator在进行这些操作时,会同时为应用程序的用户进行一些处理,随着这些处理的增加,对象间的引用关系也会发生“改变”,随之,也会产生垃圾,负责回收这些垃圾的机制就是GC

  • 堆值得是用于动态(也就是执行程序时)存放对象的内存空间,当mutator申请存放对象时,所需的内存空间就会从这个堆中分配给mutator

    GC时管理堆中已分配对象的机制,在开始执行mutator前,GC要分配用于堆的内存空间,一旦开始执行mutator,程序就会按照Mutator的要求在堆中存放对象,等到堆被对象占满之后,GC就会启动,从而分配可用空间,如果不能分配足够的可用空间,就要扩大堆

  • 活动对象/非活动对象

    活动对象:我们将分配到内存空间中的对象中那些能通过mutator引用的对象

    非活动对象:把分配到堆中哪些不能通过程序引用的对象称为"非活动对象",也就是我们称作的“垃圾”

    死了的对象不可能活过来,因为就算用mutator重新引用已经死掉的对象,我们也没有办法通过mutator找到它

    因此,GC会保留活动对象,销毁非活动对象,当销毁非活动对象时,其原本占据的内存空间就会得到释放,供下一个要分配的新对象使用

    image

  • 分配

    分配指的是在内存空间中分配对象,当mutator需要新对象时,就会向分配器申请一个大小合适的空间,分配器则在堆的可用空间中找寻满足要求的空间,返回给Mutator

    当堆被所有活动对象占满时,就算运行GC也没有办法分配可用空间,有两个选择

    • 销毁至今为止的所有计算结果,输出错误信息
    • 扩大堆,分配可用空间
  • 分块

    分块在GC的世界里指的是利用对象而事先准备出来的空间

    初始状态下,堆被一个大的分块所占据,然后程序会根据mutator的要求把这个分块分割成合适的大小,作为活动对象使用,活动对象不久后被转换为垃圾被回收,然后可能又再次成为分块,为下次利用做准备

  • 根,在GC的世界里,是指向对象的指针的起点部分

  • 评价标准

    评价GC算法的性能时,采用下面4个方法:

    • 吞吐量

      指的是单位时间内的处理能力,
      image

      在mutator整个执行过程中,GC启动了3次,而且以GC为对象的堆大小是HEAP_SIZE,所以GC的吞吐量为HEAP/(A+B+C)

      GC复制算法只检查活动对象,而GC标记-清除算法则会检查所有的活动和非活动对象

    • 最大暂停时间

      所有的GC算法都会在GC执行过程中令mutator暂停执行,最大暂停时间指的是因执行GC而暂停执行mutator的最长时间,上图中的最大暂停时间就是B

    • 堆使用效率

      可用的堆越大,GC运行越快,越想有效的利用有限的堆,GC话费的时间就越长

    • 访问的局部性

      由于寄存器和缓存的存储容量小,所以一般我们会把数据放在内存里,当CPU访问数据时,仅把使用的数据从内存读取到缓存中,与此同时,还将它附近的所有数据都读区到缓存中,从而压缩读取数据所需要的时间

      由于“访问局部性”的原因,会把具有引用关系的对象安排在堆中较劲的位置。

GC标记-清除算法

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant