GC 是什么?
GC 即 垃圾回收(Garbage collection )
垃圾是指:在运行的程序中没有被任何指针指向的对象
,这个对象就是要被回收的垃圾。
如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出。
- 确定对象生命周期然后垃圾回收
- 对特定大小的对象开设内存池,整理出的内存分配给新的对象
Stop-The-World
机制简称 STW,在执行垃圾收集算法时,除了垃圾收集器之外其他所有线程都会被挂起。
哪些语言提供 GC ?
从原理上而言,所有的语言都能够自行实现 GC。
有的语言设计时就提供了 GC,有的语言不提供 GC,但可以手动管理内存。
- 提供GC的语言:
Python
JavaScript
Java
Objective-C
Swift- 不提供 GC (手动管理内存,但可以自行实现 GC )的语言:
C
C++- 也有一些语言可以在编译期,依靠编译器插入清理代码的方式,实现精准的清理,例如:Rust
手动管理内存(没有GC)的优缺点
- 劣势(运行时可能发生的错误):
- 在仍然有指向内存区块的指针的情况下释放这块内存时,会产生悬挂指针,从而后续可能错误的访问已经用于他用的内存区域。
- 多重释放同一块申请的内存区域可能导致不可知的内存损坏。
- 优势:
- 没有额外的性能开销
- 精准的手动内存管理,极致的利用机器的性能
3种垃圾回收算法的简单对比
比较\回收算法 | 标记-清除 | 标记-整理 | Scavenge(复制算法) |
---|---|---|---|
速度 | 中等 | 最慢 | 最快 |
空间开销 | 少(有碎片) | 少(无碎片) | 双倍空间(无碎片) |
是否移动对象 | 否 | 是 | 是 |
相关文章
注:因为锁文无法链接(https://www.zhihu.com/question/文章号)
- 各种编程语言的实现都采用了哪些垃圾回收算法?这些算法都有哪些优点和缺点?
- Go 对比 Java、V8 中 JavaScript 的 GC 性能如何?
- 一个采用GC的原生程序语言有没有可能性能上超越非GC的原生程序语言?
- 编译型语言和解释型语言详解
网友评论