关于java垃圾回收器(GC)的一些基础知识

定义: Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。
注意:回收的是已经不再被使用的对象所占的内存

一、几个小问题:

  1. Java中垃圾回收有什么目的?
    垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。

  2. finalize()方法什么时候被调用?
    GC在释放对象占用的内存之前,会调用该对象的finalize()方法(从Object对象中继承),释 放对象所占用的一些其他资源

  3. 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
    不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

二、判断对象是否存活(是否被引用)

  • (1)、引用计数法:使用引用计数法,要先给每一个对象中添加一个计数器,一旦有地方引用了此对象,则该对象的计数器加1,如果引用失效了,则计数器减1。这样当计数器为0时,就代表此对象没有被任何地方引用。这种方法实现简单,判定效率也很高,在大部分情况下都是一个比较不错的方法。但是在Java虚 拟机中并没有选用引用计数法来管理内存,其主要原因是它很难解决对象之间相互引用的问题,如果两个对应互相引用,导致他们的引用计数都不为0,最终不能回收他们。我们来举个例子

class Person{
public Person friend= null;//定义一个朋友
private String name = “”;//姓名
Person(String name){
this.name = name;
}
}
public class Demo {
public static void main(String[] args) {
Person Jack = new Person(“Jack”);//创建一个人物:Jack
Person Tom= new Person(“Tom”);//创建一个人物:Tom
Jack.friend = Tom;//设置jack的朋友是Tom
Tom.friend= Jack ;//设置Tom的朋友是jack
}
}
其中Jack和Tom两个对象互相引用,因此如果使用引用计数法来判断对象是否死亡的话,垃圾回收机制是不能回收这两个对象的。

  • (2)、可达性分析算法:(能与GC Root构成连通图的对象)
    在大部分主流语言中都是通过此方法来判断对象是否存活的,这个算法的思想是通过一系列被称为“GC root”的对象作为起始点, 从这些节点开始向下搜索,走过的路径叫做引用链。如果一个对象没有通过引用链连接到GC root节点,则证明此对象是不可用的,
    如下图所示,GC Roots 是根节点,凡是能通过引用链连接上GC Root 的Object 1,2,3,4都是被使用的对象。但是Object 5,6,7却 不能通过任何方式连接上根节点,因此判定Object 5,6,7为可回收的节点。

在JAVA语言中,可以作为GC root的对象包括以下几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象。
方法区中类静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI(Java Native Interface)引用的对象。

三、 垃圾收集算法:

  垃圾收集算法:(1)、标记-清除算法    算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它是最基础的收集算法(2)、 复制算法     为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。(3)、标记-整理算法   类似于标记-清除算法,但是第二步进行内存回收时,将存活的对象向内存一端移动,达到消除内存碎片问题。(4)、分代收集算法    java sun hotspot虚拟机将内存分为新生代(堆)、老年代(堆)、永久代(方法区、常量池、即时编译代码)几个区域, 新生代主要使用基于复制算法的垃圾回收,老年代和永久代主要使用标记-整理算法进行垃圾回收。具体每个区域使用哪种垃圾回收算法还要视收集器的实现制约

总结: 对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。
通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。 当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。
可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行

关于java垃圾回收器(GC)的一些基础知识相关推荐

  1. java垃圾回收 分代_JVM基础知识(四)- 分代回收机制和垃圾回收算法

    这次我们来讲讲垃圾回收,前边或多或少的都提及过垃圾回收的知识点,我们经常说的GC(Garbage Collection)就是垃圾回收,我们都知道JAVA都是由C++演化而来,那么JAVA和C++很重要 ...

  2. 深入理解Java虚拟机:Java垃圾回收器

    本篇内容包括:7 种 Jvm 垃圾回收器的介绍.对比 以及 对应的 Jvm 参数设置,这 7 种包括了:Serial.ParNew 以及 Parallel Scavenge 三种新生代回收器 和 :S ...

  3. JAVA垃圾回收器的介绍

    JAVA垃圾回收器的介绍 垃圾回收器一共有7种: 如下图 其中G1 和 CMS 属于比较新的,暂停时间比之前较少. serial serial Old parNew 这个是serial的多线程版本. ...

  4. java垃圾回收器有哪些_各种Java垃圾回收器的比较总结

    原标题:各种Java垃圾回收器的比较总结 现在已经是2017年了,但是对大多数开发人员而言有两件事情仍然是个谜--垃圾回收以及异性(码农又被嘲笑了).由于我对后者也不是特别了解,我想我还是试着说说前者 ...

  5. 什么是 Java 垃圾回收器~

    什么是 Java 垃圾回收器 Java 垃圾回收器是 Java 虚拟机 (JVM) 的三个重要模块 (另外两个是解释器和多线程机制) 之一,为应用程序提供内存的自动分配 (Memory Allocat ...

  6. Java垃圾回收器的工作原理

    上课,老师照本宣科,实在难以理解,干脆就看书包里的Java书,正好看了Java的垃圾回收器是如何工作的,觉得有必要记录一下. 参考于 Java编程思想第四版(Thinking in Java) 老年代 ...

  7. 从头学 Java,复习环境搭建与基础知识,卷起来

    目录 1.Java 起源与演变 1.1.起源 1.2.演变 2.Java 体系与特点 3.Java 跨平台原理 3.1.Java 技术的两种核心机制 3.3.垃圾回收器(GC) 3.4.JDK 4.什 ...

  8. 超详细的Java面试题总结之JavaWeb基础知识总结

    超详细的Java面试题总结之JavaWeb基础知识总结 Java互联网架构师08-29 16:01 打开网易新闻 查看更多精彩图片 Servlet总结: 在Java Web程序中,Servlet主要负 ...

  9. java高手之路上的必备基础知识

    其实Java也就这么回事,重要的还是坚持,不能三天打鱼两天晒网.每一个分支下都是一门专业的技术,重要的是证明学精,熟练运用各项软件语言. 下面和大家分享java高手之路上的必备基础知识: 1.面向对象 ...

最新文章

  1. redis主从_Redis主从复制部署
  2. python如何使用多线程_Python 类中的方法如何多线程调用?
  3. 前端学习(538):全屏布局
  4. odbc数据源的配置
  5. shell命令locate
  6. 微机接口技术实用教程(第2版)-任向民,王克朝,宗明魁-课后答案
  7. 佳能 6D Mark II与 90D 对比评测
  8. ppt文件太大怎么压缩
  9. 目前域名防封的新知识
  10. Bable详解和前端模块化
  11. 计算机在表格底部插入一空行怎么弄,简单高效的Excel技巧,表格隔行插入空行,这两种方法很实用...
  12. 微信小程序农历阳历日期选择器选中日期同时获取对应农/阳历日期 这个demo问题的修改
  13. 1、Linux中的socket与TCP通信
  14. ubuntu18.04同时使用多个有线网络和无线网络时如何设置优先级
  15. 怎样看待程序员驻场?
  16. java下载m3u8视频,解密并合并ts(二)
  17. 商店销售某一商品,每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,一次购10件以上者,还可以享受9.8折优惠。现已知当天3个销货员的销售情况为
  18. 【虹科案例】嵌入式系统的实时高速记录器——虹科高速数字化仪应用
  19. 天猫11·11:蚂蚁金服如何用小团队支撑数亿人买买买?
  20. Can总线芯片TJA1051替代TJA1050

热门文章

  1. SQL Server中的表变量
  2. SQL Server中的身份功能教程
  3. INSERT INTO SELECT语句概述和示例
  4. sql初学者指南_使用tSQLt框架SQL单元测试面向初学者
  5. kuberneters dashboard认证及分级授权
  6. BeautifulSoup模块过滤掉html标签,只拿文本内容(处理XSS攻击)
  7. logger.debug的用处
  8. iOS 11 适配集锦
  9. Leetcode: Palindrome Linked List
  10. 张艾迪(创始人): 我的梦想与成长之路