JVM垃圾回收的算法很多,但是不管是哪种算法,在进行GC时大致的流程都是差不多的,主要有以下3个过程:
1. 枚举根节点
这个过程主要是找到所有的GC Roots对象,这些对象一般发生在JVM虚拟机栈栈帧、常量池中的静态对象、方法区中静态类属性引用、本地方法栈中引用的对象。这个过程会发生STW,所有的线程均运行到安全区域(Safe Region)才开始执行。
通常有两种算法:
优点是效率高,缺点是循环引用无法处理,导致内存溢出。
优点可以检测所有的对象,缺点效率低。
GC Roots节点一般为:
2. 标记
标记的过程主要是标记哪些对象是需要被回收的,有的GC算法是并行的,有的是和GC Roots标记一起执行。如果是并行的,不会发生STW。
如果是并发标记的GC算法,后面还有有一次重新标记或者最终标记。这主要是来解决在并发标记的过程中,用户线程还在一直执行,这期间有变化的对象。
标记算法常见的有两种:
3. 清除或回收
这个阶段会根据GC算法的不同采取不同的回收策略。
以上就是浅析JVM垃圾回收的过程的详细内容,更多关于JVM垃圾回收的资料请关注小牛知识库其它相关文章!
本文向大家介绍浅谈jvm中的垃圾回收策略,包括了浅谈jvm中的垃圾回收策略的使用技巧和注意事项,需要的朋友参考一下 java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已经介绍了CLR中GC的对象回收方式,是基于代的内存回收策略,其实在java中,JVM的对象回收策略也是基于分代的思想。这样做的目的就是为了提高垃圾 回收的性能,避免对堆中的所有对象进行检查时所带来的程序的响应的延迟,因
主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、
主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、
Java堆中存放着大量的Java对象实例,在垃圾收集器回收内存前,第一件事情就是确定哪些对象是“活着的”,哪些是可以回收的。 引用计数算法 引用计数算法是判断对象是否存活的基本算法:给每个对象添加一个引用计数器,没当一个地方引用它的时候,计数器值加1;当引用失效后,计数器值减1。但是这种方法有一个致命的缺陷,当两个对象相互引用时会导致这两个都无法被回收。 根搜索算法 在主流的商用语言中(Java、
本文向大家介绍JVM垃圾回收算法的概念与分析,包括了JVM垃圾回收算法的概念与分析的使用技巧和注意事项,需要的朋友参考一下 前言 在JVM内存模型中会将堆内存划分新生代、老年代两个区域,两块区域的主要区别在于新生代存放存活时间较短的对象,老年代存放存活时间较久的对象,除了存活时间不同外,还有垃圾回收策略的不同,在JVM中中有以下回收算法: 标记清除 标记整理 复制算法 分代收集算法 有了垃圾回收算
本文向大家介绍浅析Java内存模型与垃圾回收,包括了浅析Java内存模型与垃圾回收的使用技巧和注意事项,需要的朋友参考一下 1、Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码。如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是Native方