GC简单介绍

java语言执行在java虚拟机(jvm)上。为了解决有限的空间和性能的保证这个矛盾体,jvm所具备的GC能力。能够有效的清除不用的对象。使空间的利用更加合理。以下介绍该机制的原理。

推断对象已废弃

  • 引用计数法

    给每个对象都配备一个计数器,对于该对象,若添加一个指向它的引用,则计数器加1。每失效一个引用。则计数器减一。

    可是,假设两个对象互相引用,但都对于外部都已失去用途,则这种两个对象是无法被计数为0的,由于他们的计数器永远都仅仅为1。
  • 可达性分析法

    为了解决引用计数法的缺陷,我们引入可达性分析。

    从引用链的顶端root開始,仅仅要在这条引用链上的对象都是实用的,因此不应该被回收。而对于剩下的对象,一定是不可到达的对象,也就没什么意义了。

怎样释放没用的对象空间

  • 标记清除

    将废弃的对象空间标记出来,直接清除就可以。

    可是。这样会造成空间的碎片过多。

    假设有较大的对象须要空间,则会有更大的可能,它无法找到这种空间。

  • 复制法

    将堆空间分为两块,最好还是叫做from和to。每次new对象的时候。先放在from上,(to块保持空暇),直到from区域放满。这是要进行垃圾回收,将存活的对象拷贝到 to上,然后清空from区域,并将from和to进行互换,又一次開始。

    缺点是,总有一部分空间要充当to区域,因此该区域总是空暇着等待交换。造成内存的浪费。

  • 标记整理

    相似于标记清楚,仅仅只是是在标记之后不是简单的清除,而是将存货对象整理好。一个一个排在一起。让后释放剩下的连续的一整块空间。这样做的坏处是。须要对全部对象进行复制移动,比較耗时。

  • 分代处理

    将堆内存区分为Eden区,survivorFrom区、surviorTo区(以上三个都属于年轻代),老年代和永久代。

    1. 当新建对象的时候通常是首先放在年轻代的Eden和surviorFrom中,当满了之后,将存活对象放入survivorTo中(及MinorGC),放不下的直接放入年老代。互换survivor的from和to区。

    2. 当老年代也满了之后。将执行一整个的大清洗FullGC,将全部堆内存(除了永久代)进行一次完整的GC。
    3. 永久代是不会在主程序执行期间进行GC的。永久代主要存放Class类信息。

JVM——垃圾回收(GC)的更多相关文章

  1. 性能测试三十五:jvm垃圾回收-GC

    垃圾回收-GC 三个问题 哪些内存需要回收? 什么时候回收? 如何回收? YoungGC和FullGC: 新生代引发的GC叫YoungGC 老年代引发的GC叫FullGC FullGC会引起整个Jvm ...

  2. JVM 垃圾回收GC Roots Tracing

    1.跟搜索算法: JVM中对内存进行回收时,需要判断对象是否仍在使用中,可以通过GC Roots Tracing辨别. 定义: 通过一系列名为”GCRoots”的对象作为起始点,从这个节点向下搜索,搜 ...

  3. JVM垃圾回收(GC)流程

    /* 首先介绍一下JVM中堆内存的组成: JVM堆内存主要由三部分组成: (1)新生代: 伊甸园区,存活区,伸缩区 (2)老年代: 老年区,伸缩区 (3)元空间(永久代): 元空间,伸缩区 注意:JD ...

  4. JVM垃圾回收——GC

    一.JVM内存分配与回收 下图为堆内存结构图(注意:元数据区(MetaData )实际上不属于堆): 1.对象优先在Eden区分配 大多数情况下,对象在新生代中Eden区分配.当Eden区没有足够空间 ...

  5. JVM垃圾回收GC

    1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1  space)    Minor GC (老年代)Old Generation (Tenured space)   ...

  6. JVM—垃圾回收GC算法

    1 GC算法简介 算法 特点 标记-清除 分为"标记"和"清除"两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块. 标记-整理 先标记. ...

  7. 修改Tomcat的jvm的垃圾回收GC方式为CMS

    修改Tomcat的jvm的垃圾回收GC方式 cp $TOMCAT_HOME/bin/catalina.sh $TOMCAT_HOME/bin/catalina.sh.bak_20170815 vi $ ...

  8. Java:JVM垃圾回收(GC)机制

    JVM垃圾回收算法 1.标记清除(Mark-Sweep) 原理: 从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)适用场合: 存活对象较多的情况下比较 ...

  9. .Net平台GC VS JVM垃圾回收

    前言 不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照 ...

  10. JVM垃圾回收(GC)

    JVM垃圾回收(GC) 1. 判断对象是否可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,但无法解决对象相互循环引用的问 ...

随机推荐

  1. 李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)

    李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...

  2. ThreadPoolExecutor 源码阅读

    目录 ThreadPoolExecutor 源码阅读 Executor 框架 Executor ExecutorService AbstractExecutorService 构造器 状态 Worke ...

  3. Git学习笔记:基础篇

    git可以说是所有开发者出开发语言之外的最基本的基本功了,熟悉git可以方便的进行代码版本控制,以及与其他开发者进行合作开发.本文内容是我以往学习git时做的笔记,主要是关于git最基本的操作,但 只 ...

  4. Python3基础之异常结构

    自定义异常类 class ShortInputException(Exception): def __init__(self, length, atleast): Exception.__init__ ...

  5. C++ 随机数rand()和srand()

    标准函数库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h中定义的一个整数,它与系统有关. 例如在我的机器上,RAND_MAX=32767.可以 ...

  6. linux find命令用法

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  7. react-native组件封装与传值

    转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-component-packaging-and- ...

  8. [原创]Java性能优化权威指南读书思维导图4

    [原创]Java性能优化权威指南读书思维导图4

  9. Dll注入经典方法完整版

    总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...

  10. selenium+python自动化80-文件下载(不弹询问框)

    前言 上一篇是点弹出框上的按钮去保存文件,本篇介绍一种更加优雅的方法,加载Firefox和Chrome的配置文件,不弹出询问框后台下载. 一.FirefoxProfile 1.点下载的时候,如下图,如 ...