1.什么是垃圾回收?

垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。

2.什么时候垃圾回收?

System.gc()

Runtime.getRuntime().gc()

上面的方法调用时用于显式通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。

3.垃圾回收 回收的是什么?

垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身。换言之,垃圾回收只会负责释放那些对象占有的内存。对象是个抽象的词,包括引用和其占据的内存空间。当对象没有任何引用时其占据的内存空间随即被收回备用,此时对象也就被销毁。但不能说是回收对象,可以理解为一种文字游戏。

4.垃圾回收 回收什么对象?

从gc root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。

5.垃圾回收器将某些特殊的对象定义为GC根对象。所谓的GC根对象包括?

1.虚拟机栈中引用的对象(栈帧中的本地变量表);

2.方法区中的常量引用的对象;

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

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

5.活跃线程

接下来,垃圾回收器会对内存中的整个对象图进行遍历,它先从GC根对象开始,然后是根对象引用的其它对象,比如实例变量。回收器将访问到的所有对象都标记为存活。

当标记阶段完成了之后,所有的存活对象都已经被标记完了。其它的那些(上图中灰色的那些)也就是GC根对象不可达的对象,也就是说你的应用不会再用到它们了。这些就是垃圾对象,回收器将会在接下来的阶段中清除它们。

6.GC 回收机制

新生代GC(Minor GC/Scavenge GC):发生在新生代的垃圾收集动作。因为Java对象大多都具有朝生夕灭的特性,因此Minor GC非常频繁(不一定等Eden区满了才触发),一般回收速度也比较快。在新生代中,每次垃圾收集时都会发现有大量对象死去,只有少量存活,因此可选用复制算法来完成收集。

老年代GC(Major GC/Full GC):发生在老年代的垃圾回收动作。Major GC,经常会伴随至少一次Minor GC。由于老年代中的对象生命周期比较长,因此Major GC并不频繁,一般都是等待老年代满了后才进行Full GC,而且其速度一般会比Minor GC慢10倍以上。另外,如果分配了Direct Memory,在老年代中进行Full GC时,会顺便清理掉Direct Memory中的废弃对象。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记—清除算法或标记—整理算法来进行回收。

新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从Eden到Survivor,最后到老年代。

7.引用类型

对象引用类型分为强引用、软引用、弱引用和虚引用

强引用:就是我们一般声明对象时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收。

软引用:软引用一般被作为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间,如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。

弱引用:弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。

强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们一般被作为缓存使用,而且一般是在内存比较受限的情况下作为缓存。

因为如果内存足够大的话,可以直接使用强引用作为缓存即可,同时可控性更高。因而,他们常见的是被使用在桌面应用系统的缓存。

虚引用顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

java gc回收机制种类_JAVA的垃圾回收机制(GC)相关推荐

  1. java垃圾回收机制标记_Java的垃圾回收机制-垃圾收集算法(一)

    当需要排查各种内存溢出,内存泄漏等问题时,当垃圾收集成为系统达到更高并发的瓶颈时,我们有必要深入GC的原理. image.png 常见垃圾回收算法 在查看垃圾回收具体过程的时候,运行程序加上: -XX ...

  2. java gc回收机制种类_Java垃圾回收机制

    对象被判定为垃圾的算法 引用计数算法 和 可达性分析算法 引用计数算法 判断对象的引用数量通过判断对象的引用数量来决定对象是否可以被回收 每个对象实例都有一个引用计数器,被引用+1,完成引用-1 任何 ...

  3. Java GC系列(4):垃圾回收监视和分析

    转载自  Java GC系列(4):垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习用于垃圾回收监视和分析的工具.然后,选用一种工具来监视一个Java示例程序的垃圾回收过程.如果你是一名 ...

  4. Java进阶之深入理解对象与垃圾回收机制常见面试题

    内存泄漏和内存溢出辨析 内存溢出:实实在在的内存空间不足导致: 内存泄漏:该释放的对象没有释放,多见于自己使用容器保存元素的情况下. 常量池与String 常量池 常量池有很多说法,包括运行时常量池. ...

  5. java 什么时候进行垃圾回收_Java中垃圾回收有什么目的?什么时候进行垃圾回收?...

    仅提供一个大致的思路: 垃圾回收(gc)的目的是释放堆中不需要保存的对象,达到内存的充分利用. 1.回收哪些对象的判定 垃圾回收最简单的思路是采用引用计数的方式,即记录对象被引用的次数,直到一段时间内 ...

  6. jvm垃圾回收机制_干货|JVM垃圾回收机制

    前言 不同于C++程序员必须自己完成内存的分配.使用和释放,JAVA语言提供了垃圾回收机制(GC,Garbage Collection),所以JAVA程序员仅需要负责分配和使用内存即可,而释放内存则由 ...

  7. javascript 垃圾回收机制--分代式垃圾回收机制

    以前对 javascript 的垃圾回收机制没有深入了解过.以为只是简单的标记清除法.即从根对象开始找它的引用,然后依次往后找它引用的引用,依次递归,将所有被引用的变量打上标记.然后在遍历完后,清除没 ...

  8. java中的异常种类和区别以及处理机制和区别

    java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...

  9. 关于c#:GC.Collect()之后是否立即运行垃圾回收?

    用C#写了一个运用ICE组件进行接口通信的服务程序,程序运行很正常,可是在客户端调用ICE接口时出现了大量的数据丢失,而且偶尔还通信不上,服务端最明显的现象就是telnet服务的通信端口时不通(cmd ...

最新文章

  1. 那个一年发了4篇Cell的研究生,后来怎么样了?
  2. SAP MM 按采购订单查询付款信息的报表?
  3. Java数据结构和算法:HashMap的实现原理
  4. 这 6 个 Spring Boot 项目够经典
  5. Python求解多项式方程
  6. 用户增删改查 django生命周期 数据库操作
  7. EXIF 方向参数 Orientation
  8. 二层交换机、三层交换机和路由器的区别
  9. 计算机毕设(附源码)JAVA-SSM绩效考核管理系统
  10. java.commen包的一些用法StringUtils.equals()
  11. Linux 定时任务shell脚本定时移动服务器日志文件到指定目录下
  12. 图片上传流程前端上传文件后端保存文件并返回图片地址
  13. 根据后序遍历和中序遍历建树的方法
  14. UE4_第三方库的引用
  15. using Aspose文档合并总结
  16. 《3S新闻周刊》(转帖)
  17. Spark基础知识(个人总结)
  18. 炉石服务器在维护吗,炉石传说:深夜服务器疑“再次崩溃”!这次还会有“补偿”吗?...
  19. TLS-SRTP协议详解
  20. 无能为力,黑客承认iOS6内购破解不可能实现了

热门文章

  1. linux中python安装_linux环境下的python安装过程图解(含setuptools)
  2. asterisk版本选择
  3. 中高德地图只显示某一城市_Excel实用知识:从零开始,一步步制作属于你自己的三维演示地图...
  4. 广义典型相关分析_重复测量数据分析及结果详解(之二)——广义估计方程
  5. 【转】C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁
  6. 【转】Microsoft Teams快速上手系列-02Teams组成概述及使用分享
  7. ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】
  8. 老王说ros的tf库
  9. mysql 第二大的数据_MYSQL – 从大表中的第二行中选择数据
  10. 搜索计算机硬盘的索引恢复,可以做到秒搜的神器everything,你可知对硬盘到底有多大伤害...