JVM的垃圾回收机制和Golang的垃圾回收机制
文章目录
前言
为什么要写这篇文章,在仔细的了解了jvm垃圾回收机制和Golang的回收机制之后发现其有很多的相同点和不同点,未来的发展会不会有共通之处,这是我的想法。
一、 哪些内存需要回收
在弄清答案之前我们首先要知道什么样数据我们是可以回收的。
JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。
其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题
Java堆区和方法区则不一样,内存的分配和回收是动态的所以针对这部分区域有一些特定的算法。
二、算法
2.1可达性分析算法
简单的说法就是看其是否于GCRoot相连,如果不相连我们认为其可回收。
在Java语言中,可作为GC Roots的对象包括下面几种:
1、虚拟机栈中引用的对象(栈帧中的本地变量表);
2、方法区中类静态属性引用的对象;
3、 方法区中常量引用的对象;
4、本地方