gc roots包括以下几个:

  虚拟机栈(栈桢中的本地变量表)中的引用对象

  方法区中的类静态属性引用的对象

  方法区中的常量引用的对象

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

  java,c#对内存的回收的算法是根搜索算法,基本思路是通过一系统的名为"gc roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(reference chain),从一个对象到gc roots没有任何引用链相连(用图论的话来说就是从gc roots到这个对象不可达时),则证明对象是不可用的

而不是采用的引用计数算法,引用计数算法就是给对象添加一个引用计数器,每当有一个地方引用它时,计数算加1,当引用失效时,计数器减1,任何时刻计数器都为0的对象就是不可能再被使用的。

但是这解决不了图中根路径到不了,但是到不了的图节点之间有关联的问题,所以采用根搜索算法

  在根搜索算法中有可达的对象,不会"非死不可",这时处于缓刑阶段;如果对象在进行根搜索后发现没有与gc roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finailze()方法。当对象没有覆盖finalize()方法,或者这个方法已经被虚拟机调用过。虚拟机将这两种情况都视为没有必要执行,值得一提的是,Object类里面有一个finalize()方法,所以一般来说有用担心没有finalize()方法。

  如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue的队列中,并在稍后由一条由虚拟机自动建立的。低优先级的finalizer线程去执行。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。这样做的原因是,如果 一个对象在finalize()方法中执行缓慢,或者发生了循环,将会很可能导致F-Queue队列中的其他对象永久处于等待状态,甚至导致整个内存回收系统崩溃。finalize()方法是对象逃脱死亡命运的最后一次机会,稍后gc将对F-Queue中的对象进行第二次小规模的标记,如果对象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,比如把自己(this)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移除出“即将回收”的集合;如果对象这时还没逃脱,就被回收了

  方法区也是有垃圾回收的,只是“性价比”一般比较低;在堆中,常规应用进行一次垃圾收集一般可以回收70-95%的空间,而方法区的垃圾收集效率远低于此。

  永久代,即方法区主要回收两部分内容:废弃常量和无用的类。回收废弃学量与回收java堆中的对象非常类似。以常量池中字面量的回收为例,假如一个字符串“abc”已经进入了常量池中,但是当前系统没有任何一个String对象是叫做“abc"的,换句话说是没有任何String对象引用常量池中的”abc“常量,也没有其他地方引用这个字面量,如果在这时发生内存回收,而且必要的话,这个”abc“常量就会被系统请出常量池,常量池中的其他类,接口,方法,字段的答题引用也与此类似。

  判断一个常量是否是废弃常量比较简单,而要判定一个类是否是无用的类的条件则相对苛刻很多,类需要同时满足下面3个条件才能算是无用的类:

  1.该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例

  2.加载该类的classLoader已经被回收

  3.该类对应的java.lang.class对象没有在任何地主被引用,无法在任何地方通过反射访问该类的方法

  这里说的仅仅是可以,不是和对象一样,不使用就必然会回收。是否对类进行回收,HotSpot虚拟机提供了-Xnoclassgc参数进行控制,还可以使用-verbose:class及-XX:+TraceCalssLoading、-XX:+TraceClassUnLoading查看类的加载和卸载信息。-verbose:class和-XX:+TraceClassLoading可以在Product版的虚拟机中使用,但是-XX:+TraceClassLoading参数需要fastdebug版的虚拟机支持

  在大量的使用反射,动态代理,cglib等bytecode框架的场景,以及动态生成jsp和osgi这类频繁自定义classLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出

此博内容来自深入理解java虚拟机-周志明,具体参数未做实验

gc roots 垃圾回收的更多相关文章

  1. JVM总括二-垃圾回收:GC Roots、回收算法、回收器

    JVM总括二-垃圾回收:GC Roots.回收算法.回收器 目录:JVM总括:目录 一.判断对象是否存活 为了判断对象是否存活引入GC Roots,如果一个对象与GC Roots没有直接或间接的引用关 ...

  2. java: system.gc()和垃圾回收机制finalize

    System.gc()和垃圾回收机制前的收尾方法:finalize(收尾机制) 程序退出时,为每个对象调用一次finalize方法,垃圾回收前的收尾方法 System.gc() 垃圾回收方法 clas ...

  3. 关于GC进行垃圾回收的时机

    前言 今天查看一个同事的代码,发现代码中多处地方使用了GC.Collect()方法,我问他为什么这么做,他说感觉程序中定义了好多变量,怕GC回收不及时,用GC.Collect()可以手动掌控GC进行垃 ...

  4. 【转载】Java性能优化之JVM GC(垃圾回收机制)

    文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...

  5. Java性能优化之JVM GC(垃圾回收机制)

    Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...

  6. System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接

    System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接

  7. JVM——GC(垃圾回收)算法

    一.垃圾回收的基本概念 垃圾回收(GC,Garbage Collection),指内存中不会再被使用的对象清理掉. 垃圾回收有很多种算法:如引用计数法.标记压缩法.复制算法.分代/分区的思想 二.垃圾 ...

  8. GC(垃圾回收)

    Java程序的内存分配和回收都是由JRE在后台自动进行的.JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收GC.通常JRE会提供一条超级线程来进行检测和控制,一般都是在CPU空闲或内存不足时 ...

  9. jvm GC:垃圾回收的测试与分析

    实验环境: (1)Java版本以及模式: java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0 ...

随机推荐

  1. c#winform窗体嵌入

    最近开发项目,错误的理解了需求,自己做了个窗体的嵌套,虽然是错误的理解了,但是功能还是实现了,做下标记,需要时可以拿来看看. 新建两个窗体Form1和Form2,现在需要将Form2显示到Form1里 ...

  2. 复制SharePoint列表项(SPListItem)到另一个列表

    从理论上讲,有一个简单到难以置信的解决办法:SPListItem提供了一个CopyTo(destinationUrl)方法(可参考MSDN).不幸的是,这个方法似乎用不了.至少对我的情况(一个带附件的 ...

  3. 图情期刊要求2015(A,B,C类)

    中国图书馆学报+情报学报+大学图书馆学报+图书情报工作+图书情报知识+情报理论与实践+国家图书馆学刊+情报杂志+图书与情报+情报科学+图书馆杂志+图书馆建设+情报资料工作+图书馆论坛+现代图书情报技术 ...

  4. Angularjs学习笔记(五)----显示和格式化数据

    一.引用指令 在AngularJS的文档中,所有指令的名字以驼峰命名法.而在模板中,则需要以蛇形命名法.可以以冒号分割(ng:model)或下划线分割(ng_model),更常见的是以ng-model ...

  5. Window10+VS2015+DevExpress.net 15.1.7完美破解(图)

    终于找到一个可用的破解工具了,并更新到最新的组件包DevExpressComponents-15.1.7.15288.exe,先看图 破解方法: 先安装DevExpressUniversalTrial ...

  6. Java线程基础实例

    概述 Java线程是一个在实战开发中经常使用的基础功能,而在Java中线程相关的类在java.lang和java.util.concurrent里 Thread package thread.base ...

  7. SpringRMI远程方法调用

    Spring为各种远程访问技术的集成提供了工具类. 该小段引用自 http://www.open-open.com/lib/view/open1408957290478.html Spring远程支持 ...

  8. Spring bean 实现初始化、销毁方法的方式及顺序

    Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作,常用方法有三种: 使用注解,在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是 ...

  9. js对象的继承以及公有私有属性的定义和读写

    最近想写一些js工具,有些方面需要用到面向对象的方法,比如继承父类属性和方法.通过私有化隐藏某些对象的属性等,因为没有系统的学习js,所以不知道怎么做,觉得很伤脑筋. 今天受到技术群里朋友的提示,并查 ...

  10. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    控制台包空指针后跟这个异常,是因为控制层调用service时的失败,无法读到sql,问题在于controller在引入的service没有自动装配,在引入多个service时,每个service都要自 ...