class会不会回收?用不到的class怎么回收_牛X的java程序员必备的GC基础知识, 面试肯定用的到...
1. GC回收哪些内存区域呢?
- 堆内存
- 对象
- 数组
- 方法区
- 该类所有的额实例都已经被回收, 也就是java堆中不存在该类的任何实例
- 加载该类的ClassLoader已经被回收
- 该类对应的java.lang.Class对象在任何地方没有被引用, 也无法通过反射访问该类方法。
- 垃圾回收性价比比较低, 一般不回收
- 废弃常量
- 无用的类(需要同时满足以下三个条件)
2. GC是如何判断垃圾对象的?
1. 引用计数法
给对象的对象头中添加一个counter引用计数器,当该对象被引用时,counter+1,当不被引用时, counter-1
当对象的counter为0时,则说明该对象不可用,也就是垃圾对象。
缺点:容易引起对象之间的互相循环引用,造成死锁状态。
2. 可发性分析算法
通过GC Roots的对象为起点,向下搜索,能到达的对象为不可回收对象,不能到达的对象为需要回收的对象。Java中就是通过可达性分析算法来判定对象是否存活的。
3. 对象引用
无论是通过引用计数算法判断对象的引用数量,还是通过根搜索算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。
在JDK1.2之前,Java中的引用的定义很传统:**如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。**这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态。我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果
在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference),这四种引用强度依次逐渐减弱。
- *强引用*就是指在程序代码之中普遍存在,类似“Object obj = new Object()”这类的引用,*只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。*
- ****软引用****用来描述一些还有用,但并非必需的对象。**对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。**在JDK1.2之后提供了SoftReference类来实现软引用。
- 弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,****被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的的对象。****在JDK1.2之后提供了WeakReference类来实现弱引用。
- 虚引用(幽灵引用、幻影引用),他是最弱的一种引用关系。*一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。*为一个对象*设置虚引用关联的唯一目的就是希望能**在这个对象被收集器回收时收到一个系统通知*。在JDK1.2之后,提供了PhantomReference类来实现虚引用。
4. 回收过程
第一次标记:使用可达性分析算法分析之后,判断对象不可达。
第二次标记:finalize()方法(上诉或者对象自我救赎的唯一方式)。该方法会被垃圾回收器去调 用,并且只会被调用一次。所以可以在finalize方法中,重新建立可达性关联,那么就完成了自我 救赎。否则被第二次标记。
3. 垃圾对象时怎么被回收的呢?
1. 复制回收算法
使用复制算法的垃圾回收步骤:
当Eden区发生垃圾回收之后,会将Eden区和Survivor其中的一块区域中的对象,复制到另一块 Survivor区域
然后将将Eden区和Survivor其中的一块区域中的对象完全清理掉。
缺点:内存分配时会浪费新生代的10%的空间。
2. 标记清除算法
最基本的算法,主要分为标记和清除2个阶段。首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象
缺点:
- 效率不高。
- 产生空间碎片。会产生大量不连续的内存碎片,会导致大对象可能无法分配,提前触发GC
3. 标记整理算法
老年代没有人担保,不能用复制回收算法。可以用标记-整理算法,标记过程仍然与“标记-清除”算法一样,然后让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
4. 分代回收算法
当前商业虚拟机都是采用这种算法。根据对象的存活周期的不同将内存划分为几块。
- 新生代,每次垃圾回收都有大量对象失去,选择复制算法。
- 老年代,对象存活率高,无人进行分配担保,就必须采用标记清除或者标记整理算法
5. 内存分配担保
在JVM的内存分配时,也有这样的内存分配担保机制。就是当在新生代无法分配内存的时候,把新生代的对象转移到老生代,然后把新对象放入腾空的新生代。
4. GC方式有哪些?
minorGC
新生代的垃圾回收,很快就回收了,新生代回收的频率高
MajorGC
老年代的垃圾回收 比minorGC慢10倍
fullGC
整个JVM的垃圾回收。 整个堆(minorGC和majorGC)和方法区的垃圾回收。
system.gc()
老年代不够用
方法区不够用
当新生代的对象无法被老年代担保成功时
class会不会回收?用不到的class怎么回收_牛X的java程序员必备的GC基础知识, 面试肯定用的到...相关推荐
- Java程序员的日常—— 垃圾回收中引用类型的作用
在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...
- java 立刻回收_如何实现Java程序自动回收垃圾
如何实现Java程序自动回收垃圾 发布时间:2020-06-19 10:59:12 来源:亿速云 阅读:155 作者:Leah 如何实现Java程序自动回收垃圾?针对这个问题,这篇文章给出了相对应的分 ...
- java 强制gc_如何强制GC回收垃圾
Java垃圾回收机制(GC)详解 简介: 垃圾回收GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内 ...
- java垃圾回收菜鸟_java程序员不懂JVM内存回收,两年后也是个菜鸟
java程序员不懂JVM内存回收,两年后也是个菜鸟 在学java程序员的时候,如果你还不懂JVM内存回收,那么你就只能是个很一般的程序员菜鸟了,那么什么是JVM内存回收呢?今天我们就来学习,都还不深入 ...
- 【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )
文章目录 一.Java VisualVM 工具安装 Visual GC 插件 二.使用 Java VisualVM 分析 GC 内存 一.Java VisualVM 工具安装 Visual GC 插件 ...
- 解读.net垃圾回收和CLR 4.0对垃圾回收所做的改进之一-.Net编程教程
解读.net垃圾回收和CLR 4.0对垃圾回收所做的改进之一-.Net编程教程 来源:模板无忧 作者:编辑整理更新时间:2009-07-19点击:114 A survey of garbage col ...
- Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别
1. System概述: System类包含一些有用的类字段和方法.它不能被实例化. 2. gc()方法:垃圾回收器 1 public static void gc() 调用gc方法暗示着 ...
- 程序员基本功04JAVA的内存回收
读书笔记自己看的(O_O) 1.Java引用的功能和意义 程序员需要通过关键字new创建Java对象,即可视作为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间:当一个Java对象失去引 ...
- 独占设备的分配与回收_灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?...
点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 作者 l Hollis JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈. ...
最新文章
- Java RMI(远程方法调用) 实例与分析 (转)
- Ubuntu 14.04 分区方案
- boost::next_permutation相关的测试程序
- python边玩边学_边听边学数据科学
- Spring中的用到的设计模式大全
- python常用包数据分析_数据分析领域常用的五个Python包
- 软件测试工程师-缺陷报告
- linux低级格式化工具下载,Hard Disk Low Level Format Tool下载-硬盘低级格式化工具 v2.37 官方版 - 下载吧...
- java编译网络爬虫_自己动手做网络爬虫系列——1 | 学步园
- am解调matlab程序,AM调制解调的matlab仿真
- java二级大题分值_2017年9月全国计算机等级考试各级别题型分值
- Linux开发板实现 NTP时间获取
- httpd安装、配置、编译三种访问模式控制https证书的安装访问实例及排错
- 使用Viewpager Indicator实现图片无限轮播
- 怎么恢复苹果手机通讯录
- GAN二次元头像生成Pytorch实现(附完整代码)
- CentOS 7账号密码忘了怎么办?
- 云服务器哪家好?云服务器评测对比
- EVE-NG模拟器社区版网络模拟环境搭建教程
- 私有5g网络_2020-2026全球与中国私有LTE和5G网络市场现状及未来发展趋势
热门文章
- linux安装-bin.rpm,Linux离线安装jdk,bin、rpm和tar.gz三种方式及配置jdk环境变量
- $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式
- javaee实验报告心得_JavaEE实验报告.doc
- 判别分析分为r型和q型吗_电流互感器天天见,但是你真正了解和知道它的一些注意事项吗?...
- python中set函数作用如何自己用代码实现_Python进阶开发之元类编程
- mysql约束_不是吧,阿Sir,MySQL约束你竟然还不懂!
- python时间序列进行线性插值_Python pandas时间序列插值日期时间数据
- c json保存整型数组,您如何存储“ int”? NSMutableArray *或NSMutableDictionary *中的值?整数形式的JSON数据的长期问题。...
- VS2013提示错误应输入表达式
- github注册账号一直验证失败