刚学java的时候,你可能好奇,java的GC是个啥呢?
GC全称Garbage Collection/Collector(垃圾回收器),是一种虚拟机帮助程序员管理内存的方式.
打个比方.
你在C++程序员食堂吃饭,吃完了你得把盘子这些收拾干净然后送到指定地点.
但是呢,有时候你会忘掉收拾(吃完就溜~~),这个位置不就没人会坐了嘛,这就是忘记释放内存.
但是java程序员食堂就不一样了,(手动狗头),吃完了可以甩手就走.
因为有专门的阿姨帮他们收拾桌子.懒人的福利~~
"标记 - 清除" 算法是最基础的算法.
首先,它会标记需要回收的对象,标记完成之后回收所有被标记的对象.
再次回到java食堂~~
举个栗子,今天梁非凡,老八,乌鸦喊你吃饭了,点了慢慢一大桌菜!饭店上菜嘛,有快有慢,吃完的盘子得撤掉来给下道菜留个空间.但是呢,不幸的是,盘子有大有小,之前小盘子的位置咋放大盘子?这可咋整呢?
复制算法讲内存分成两个部分,而且每次只用一半,如果那一半快用完了,就把存活对象依序复制到另一块上,再把用过的那块全部清理掉.这种算法可以忽略内存碎片的问题,但是缺点也很明显,每次只能用一半的内存.
回到食堂上~~~
梁非凡大怒,把老板喊过来,训了一通.所以老板想了个法子,他把整张分成两块,每次只让阿姨在一块上菜,等上菜发现地方不够了,就移到另外一半上,这样就能有空间给大盘子了.
但是呢,还是有个小问题,原本吃饭讲究排场,现在一张桌子只能用一半,多穷酸?
乌鸦看看老板说:"我说就别吃了",刚想掀桌子,你看了看架势不对头,赶紧劝老板再想个办法.
标记整理算法是让所有的存活对象都向一端移动,接着清理掉末端的所有内存
.这样存活的对象就会聚集在一起,剩下的内存就可以直接清理了.
这次老板让阿姨先看哪些菜吃完了,然后把菜往同一个地方挪,这样位置不就大了嘛.
这个方法让乌鸦哥满意了,也就不掀他桌子了.
他是历史最悠久的收集器。而且光看名字就可以知道,这个收集器是单线程的(Serial:串行的)。
这意味着只有一个线程清理,不仅如此,用户线程在清理时必须终止(防止在清理过程中还会产生垃圾)
这个是Serial收集器的“Stop The World”。
ParNew/Parallel Scavenge 收集器是两个多线程的收集器.
不同的是,ParNew能配合CMS收集器使用.
CMS收集器基于"标记 - 清除" 算法,牺牲了吞吐量来换取垃圾回收速度.
它的运作过程分为四个步骤:
G1收集器是垃圾回收技术里程碑式成果之一,设计的目的是在维持高吞吐量的同时还能缩短内存回收时的停顿时间.至JDK14为止,G1还是默认的GC策略
特点:
G1之前的收集器,都有明确的垃圾收集的范围(新生代,老年代 etc),而G1将堆分为很多歌固定大小的区域(Region),每一个区域都能根据需要扮演不同的角色(新生代空间,老年代空间,Eden空间).
而且G1还有一类特殊的类型,巨型区域(Humongous Region),用来存放哪些大对象,判断的依据是对象是否超过50%Region的存储空间.
G1的运作分为以下四个步骤:
设计目的:
特点:
技术创作101训练营
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。