java虚拟机垃圾回收机制(GC回收) 简单了解及学习算法思想

java虚拟机总共分为五个区域,其中三个是线程私有:程序计数器,虚拟机栈,本地方法栈,两个是线程共享:堆,方法区。线程私有的区域等到线程结束时(栈帧出栈时)会自动被释放,空间比较容易清理。而线程共享的java堆和方法区中的空间较大而且没有线程的回收容易产生很多垃圾信息,GC垃圾回收真正关心的就是这部分。

要了解java的自动垃圾回收,首先应当了解java的内存分配机制:
局部变量存放在栈内存中;
对象存放于堆内存中;
方法存放于方法区中;
java虚拟机垃圾回收机制(GC回收) 简单了解及学习算法思想_第1张图片

具体详情参考https://www.cnblogs.com/skyell/p/10075556.html

由于新创建 的对象都存放在堆内存中,每当对象不再被使用成为垃圾时,虚拟机回收机制会将该对象占用的堆内存空间释放,避免不必要的空间浪费,大大减轻了程序员对于空间管理的压力。
对象被创建后jvm是如何区分还有用的对象和垃圾呢?
早期的jvm是通过引用计数的方式:
就是说,每当该对象被调用一次,则专门为该对象计数的计数器加1;
每当有一个对该对象的引用消失则计数减一,当计数为0时,则代表该对象成为了垃圾
但这样的算法有个很大的缺陷:当两个对象A,B;
A引用B,B引用A,则Jvm永远无法回收这两个对象,这样的情况较循环引用
现在最常见的算法是跟踪法,这个算法有效避免了上述缺陷:
把对象视作节点,将对象和引用之间的关系视为邻接之间的关系,即有向弧;
垃圾回收机制每隔时间遍历一次,那些无法到达的节点则被视为垃圾回收,现在常用该算法。

在此介绍两个最基本的java回收算法:复制算法和标记清理算法
复制算法:将一个栈空间分为两半,命名为A和B,初始对象在A区域,继续存活的对象(又叫可达对象)被转移到B区域,不可达的对象作为垃圾回收。此为新生代最常用的算法
标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出
标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象。这种算法有时也被成为标记-整理-压缩处理机制;

两个概念:新生代和年老代
新生代:初始对象,生命周期短的
永久代:长时间存在的对象
整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
P.S:Serial New(串行)收集器是针对新生代的收集器,采用的是复制算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制

综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。

你可能感兴趣的:(技术积累)