系列一、堆里面的分区:Eden、From、To、老年代各自的特点

一、堆里面的分区:Eden、From、To、老年代各自的特点

堆是对象共享的区域,也是垃圾回收器主要工作的地方。主要分为新生区、养老区和元空间,而这三块地方中GC主要工作在新生区和养老区,其中新生区占1/3、养老区占2/3,新生区又分为伊甸区和幸存者区,幸存者区又分为幸存者0区(From区),幸存者1区(to区),内存所占比例是8:1:1。垃圾回收主要有四大算法,分别是:1、引用计数器法 2、复制算法

3、标记清除算法 4、标记压缩算法。

1、引用计数器法:

工作原理:每次对对象的引用都维护一个计数器,当该对象的计数器为0的时候,说明没有引用指向该对象了,GC可以对该对象的内存空间进行回收了。

缺点:(1)较难处理循环引用;

(2)每次对对象的引用都需要维护引用计数器,且维护计数器本身也有一定的消耗;

2、复制算法:

工作原理:首先,当伊甸区满的时候会第一次触发GC,把还活着的对象拷贝到From区,当伊甸区再次满的时候,第二次触发GC,这时候GC会扫描伊甸区+From区,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区,同时把这些对象的年龄+1。

备注:如果有对象的年龄到达了老年的标准,则复制到老年代区。

其次,清空伊甸区和From区中的对象。经过这次清空之后,原本的From区里边为空,变为了To区

最后,To区和From区互换,原来的To区成为下一次GC时的From区。

优点:不会产生内存碎片;

缺点:GC第二次扫描拷贝存活的对象时,会导致内存减半

3、标记清除算法:

标记清除一般发生在老年代。分为2个阶段:先标记出要回收的对象,然后统一回收这些对象。

同通俗的话解释一下标记清除算法,是指程序运行期间,若可以使用的内存即将被耗尽时,GC线程将会被触发并将程序暂停,随后将要清除的对象标记一遍,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。

两个阶段

标记:从引用根节点开始标记遍历所有的GC Roots,先标记出要回收的对象;

清除:遍历整个堆,把标记的对象清除;

缺点:此算法需要暂停整个应用,会产生内存碎片。

4、标记压缩算法:

在整理压缩阶段,不再对标记的对象回收,而是将所有存活着的对象都向一端移动,然后直接清除边界以外的内存。可以看到标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存将会被整理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。

优点:标记压缩算法不仅可以弥补标记清除算法中,内存区域分散的特点,也消除了复制算法当中,内存减半的高额代价。

缺点:比复制算法多了一个标记的阶段,又比标记/清除多了一个整理内存的过程。

相关推荐
一丝晨光1 个月前
面向对象彻底性、权限访问、垃圾回收
java·c++·c#·objective-c·gc·权限·oop
小薯仔2 个月前
.net 之内存回收
.net·gc·垃圾回收
翔云1234562 个月前
Go语言的垃圾回收(GC)机制的迭代和优化历史
java·jvm·golang·gc
蓝黑20202 个月前
Java知识点小结3:内存回收
java·gc
PerfMan2 个月前
基于eBPF的procstat软件追踪程序垃圾回收(GC)事件
linux·开发语言·gc·ebpf·垃圾回收·procstat
得食猫2 个月前
JVM垃圾回收
java·jvm·gc
coffee_babe2 个月前
【JVM】垃圾收集器与GC日志(一)
java·jvm·gc·openjdk·hotspot
coffee_babe2 个月前
【JVM】垃圾回收算法(一)
java·jvm·算法·gc·openjdk·hotspot
_whitepure5 个月前
JVM中的垃圾回收器
jvm·gc·垃圾回收器
Benaso5 个月前
Golang三色标记法
golang·go·gc·三色标记法