gc roots 垃圾回收
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 垃圾回收的更多相关文章
- JVM总括二-垃圾回收:GC Roots、回收算法、回收器
JVM总括二-垃圾回收:GC Roots.回收算法.回收器 目录:JVM总括:目录 一.判断对象是否存活 为了判断对象是否存活引入GC Roots,如果一个对象与GC Roots没有直接或间接的引用关 ...
- java: system.gc()和垃圾回收机制finalize
System.gc()和垃圾回收机制前的收尾方法:finalize(收尾机制) 程序退出时,为每个对象调用一次finalize方法,垃圾回收前的收尾方法 System.gc() 垃圾回收方法 clas ...
- 关于GC进行垃圾回收的时机
前言 今天查看一个同事的代码,发现代码中多处地方使用了GC.Collect()方法,我问他为什么这么做,他说感觉程序中定义了好多变量,怕GC回收不及时,用GC.Collect()可以手动掌控GC进行垃 ...
- 【转载】Java性能优化之JVM GC(垃圾回收机制)
文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...
- Java性能优化之JVM GC(垃圾回收机制)
Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...
- System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
- JVM——GC(垃圾回收)算法
一.垃圾回收的基本概念 垃圾回收(GC,Garbage Collection),指内存中不会再被使用的对象清理掉. 垃圾回收有很多种算法:如引用计数法.标记压缩法.复制算法.分代/分区的思想 二.垃圾 ...
- GC(垃圾回收)
Java程序的内存分配和回收都是由JRE在后台自动进行的.JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收GC.通常JRE会提供一条超级线程来进行检测和控制,一般都是在CPU空闲或内存不足时 ...
- jvm GC:垃圾回收的测试与分析
实验环境: (1)Java版本以及模式: java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0 ...
随机推荐
- Python监控网站接口值
Python监控网站接口值: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'liudong' import urllib,sy ...
- 如何使用Javascript判断浏览器终端设备
WEB开发中如何通过Javascript来判断终端为PC.IOS(iphone).Android呢? 可以通过判断浏览器的userAgent,用正则来判断手机是否是ios和Android客户端 var ...
- Linux课程实践四:ELF文件格式分析
一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...
- struts2的国际化文件在jsp中的引用
struts.xml中的配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts ...
- Endless Sky源码学习笔记-2
数据载入框架: void GameData::BeginLoad(const char * const *argv)为数据载入的最上层method,其主要框架为: void Files::Init(c ...
- 微信小程序 wx.getUserInfo 解密 C# 代码
花了6小时,弄出来的代码.网上的是PHP代码 public static string DecodeUserInfo(string raw, string signature,string encry ...
- [原创][LaTex]汇总博文
0. 简介 为了查找方便,当当当当,灵机一动的设计了这个博文,有了他就能快速的查找一些该话题相关方面的一些博文了,不管是原创.转载.整理,只要是属于我自己整理的LaTex知识,应该都可以在这里找到的. ...
- [转载]Matlab之静态文本多行输出
转载文章,原文链接:Matlab中的静态文本框中显示多行内容 有时候,我们在GUI中利用静态文本框显示程序的结果,但是结果很长,一行未必可以显示的开,而静态文本框不像edit或listbox那样通过滚 ...
- [OC笔记]我的第一个OC程序
这是我第一个OC程序,详情都写在了注释里面,讲的是Student和Book这两个类的创建和使用.(是不是觉得student这个类在各种语言入门代码里经常出现呢?真实有爱) 看完这些,你会发现,咱们其实 ...
- 【转】c3p0详细配置
官方文档 : http://www.mchange.com/projects/c3p0/index.html <c3p0-config><default-config>&l ...