• GC的两种判定方法

(1) 引用计数法

给对象添加一个引用计数器,每当引用一次+1,每次失效时-1,当计数器为0时,表示对象就是不可能再被使用的。

(2) 可达性分析算法

将“GC Roots”对象作为根节点,开始向下搜索,所走过的路径成为引用链。当一个对象到GC Roots没有任何引用链时,说明此对象是不可用的。

  • 能作为GC Roots的对象

(1) 虚拟机栈中引用的对象

(2) 方法区中静态属性引用的对象

(3) 方法区中常量引用的对象

(4) 本地方法栈中JNI引用的对象

  • GC的收集方法

(1) 标记清除算法

              过程: * 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的视为垃圾对象

* 清除阶段:清除所有未被标记的对象

缺点: * 效率问题,标记和清除两个过程的效率都不高

* 空间问题,会产生大量不连续的内存碎片

(2) 复制算法

              过程: * 将原有的内存空间分成两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中存活对对象复制到未使用的内存块中,然后清除正在使用的内存块中所有对象

缺点: * 浪费一半的内存

* 如果对象的存活率很高,复制要花很长时间

(3) 标记整理算法

               过程: * 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的视为垃圾对象

* 整理阶段:将所有的存活对象压缩到内存的一端(或向另一端移动),之后清理边界所有的空间

缺点: * 效率也不高,不仅要标记存活对象,还要整理它们的引用地址

GC(垃圾回收器)中的算法的更多相关文章

  1. [Java基础]-- Java GC 垃圾回收器的分类和优缺点

    https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 参考:elasticsearch实战-使用G1 ...

  2. 一篇文章让你了解GC垃圾回收器

    简单了解GC垃圾回收器 了解GC之前我们首先要了解GC是要做什么的?顾名思义回收垃圾,什么是垃圾呢? GC回收的垃圾主要指的是回收堆内存中的垃圾对象. 从根对象出发,所有被引用的对象,都是存活对象 其 ...

  3. .NET GC垃圾回收器

    GC垃圾回收器简介 全名: Garbage Collector 原理: 以应用程序的根(root)为基础,遍历应用程序堆(heap)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡 ...

  4. JVM中的垃圾回收器及垃圾收集算法描述

    首先需要了解下JVM(Java虚拟机)中的内存分配情况: 收集器的介绍: Serial收集器:是最原始的收集器,是单线程的,实现简单,但是在后台收集垃圾的时候,其他的工作线程都会停止,直到垃圾收集线程 ...

  5. java面试一日一题:再谈垃圾回收器中的串行、并行、并发

    问题:请讲下java中垃圾回收器的串行.并行.并发 分析:该问题主要考察在垃圾回收过程中垃圾回收线程和用户线程的关系 回答要点: 主要从以下几点去考虑, 1.串行.并行.并发的概念 2.如何考虑串行. ...

  6. 如何获取GC(垃圾回收器)的STW(暂停)时间?

    前言 在现代的容器化和微服务应用中,因为分布式的环境和错综复杂的调用关系,APM(Application Performance Monitoring 应用性能监控)显得尤为重要,它通过采集应用程序各 ...

  7. GC垃圾回收器

    java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”.jvm解决的两个问题:给对象分配内存以及回收分配给对象的内存.GC:将内存中不再被使用的对象进行回收.GC的作用域是JVM运行时 ...

  8. (5)jvm垃圾回收器相关垃圾回收算法

    引用计数法[原理]--->引用计数器是经典的也是最古老的垃圾收集防范.--->实现原理:对于对象A,只要有任何一个对象引用A,则计数器加1.当引用失效时,计数器减1.只要对象A的计数器值为 ...

  9. GC垃圾回收算法

    什么是GC垃圾回收呢.日常生活中我们去餐厅吃饭吃完饭,吃完饭走了餐具不用管,服务员在把餐具拿走,这是一种方式,服务员怎么知道他要来把餐具拿走呢,因为你走了,这个位置空了.服务员什么时候拿走餐具很重要, ...

随机推荐

  1. dict常用操作

    dict是python中的常用数据结构,应该尽量掌握其使用方法 """ 初始化一个dict的四种方式: 1. dict() -> 创建一个空的dict 2. dic ...

  2. grunt教程

    https://blog.csdn.net/sinat_38992528/article/details/79400595

  3. Harbor在安装前的几个注意点

    由于Harbor有1.8后和前的配置不一样,决定先安装1.8,结果报错如下 [root@localhost harbor]# ./install.sh [Step 0]: checking insta ...

  4. 四-2、Move、fix、unfix命令

    1.Move命令--移动命令 1.对应的菜单和工具栏 2.以移动单个器件为例(以推荐的操作步骤进行操作)(具体步骤如下) 1--光标位于元件的原点 2--光标位于元件的几何中心 3--光标位于鼠标单击 ...

  5. 【2019 Multi-University Training Contest 10】

    01: 02: 03:https://www.cnblogs.com/myx12345/p/11671692.html 04: 05:https://www.cnblogs.com/myx12345/ ...

  6. IDEA搭建spingboot项目

    1.Springboot2.x是依赖于JDK1.8及以上版本的.因此先在电脑上安装JDK1.8,由于公司的项目用的是JDK1.7,所以要在JDK1.7的基础上在安装JDK1.8,让两者同时存在于电脑上 ...

  7. eclipse中maven工程添加本地库至Maven Dependencies

    1.WEB-INF文件夹下添加lib文件夹,文件夹下添加demo-client-0.1-SNAPSHOT.jar 2.pom.xml中配置如下代码: <dependency> <gr ...

  8. JS对象—对象总结(创建、属性、方法)

    1.创建对象Object 1.1 字面量的方式创建 1.2  new Object() 1.3 构造函数创建 1.4 工厂模式 1.5 Object.create()  ES5新增方法 Object. ...

  9. Adam Optimization Algorithm

    曾经多次看到别人说起,在选择Optimizer的时候默认就选Adam.这样的建议其实比较尴尬,如果有一点科学精神的人,其实就会想问为什么,并搞懂这一切,这也是我开这个Optimizer系列的原因之一. ...

  10. JS截取与分割字符串

    1.substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) start :必选项.所需的子字符串的起始位置.字符串中的 ...