Full GC 、Major GC和 Minor GC有什么不同

 我们见过很多 GC 名词如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC等。那么这么多GC如何进行大致区分?下面我们引用 R 大在知乎上的回答:

 针对 HotSpot VM 的实现,它里面的 GC 其实准确分类有两种:

Partial GC(局部 GC): 并不收集整个 GC 堆的模式

  • Young GC: 只收集 Young Gen 的 GC,Young GC 还有种说法就叫做 Minor GC,两者是一个意思;
  • Old GC: 只收集 old gen 的 GC,只有垃圾收集器 CMS 的 concurrent collection 是这个模式;
  • Mixed GC: 收集整个 Young Gen 以及部分 old gen 的 GC,只有垃圾收集器 G1 有这个模式;

Full GC(全局 GC): 收集整个堆,包括新生代,老年代,永久代(在 JDK 1.8 及以后,永久代被移除,换为 metaspace 元空间)等所有部分的模式;
接下来让我们再来了解下各个 GC:

(1)Minor GC / Young GC

首先我们先来看下 Minor GC / Young GC,大家都知道,新生代(Young Gen)也可以称之为年轻代,这两个名词是等价的。那么在年轻代中的 Eden 内存区域被占满之后,实际上就需要触发年轻代的 GC,或者是新生代的 GC。

其实就是所谓的 Minor GC,也可以称之为 Young GC。

(2)Old GC

所谓的老年代 GC,称之为 Old GC 更加合适一些,因为从字面意义上就可以理解,这就是所谓的老年代 GC。

(3)Full GC

对于 Full GC,可以说 Full GC 指的是针对新生代、老年代、永久代的全体内存空间的垃圾回收,所以称之为 Full GC。

(4)Major GC

上面我们提到,Major GC用于处理方法区的对象。这个区域不是用于存储那些从老年代存活下来的对象,这个区域也可能发生GC,发生概率很低。

(5)Mixed GC

Mixed GC 是 G1 中特有的概念,其实说白了,主要就是说在 G1 中,一旦老年代占据堆内存的 45%(-XX:InitiatingHeapOccupancyPercent:设置触发标记周期的 Java 堆占用率阈值,默认值是 45%。这里的Java 堆占比指的是 non_young_capacity_bytes,包括 old + humongous),就要触发 Mixed GC,此时对年轻代和老年代都会进行回收。Mixed GC 只有 G1 中才会出现。

WeakReference回收问题

 这个类算是一种标记,和C的指针给人的感有点像,但是起的作用可能比指针要大。我们都知道,java虚拟机的垃圾回收算法为可达性分析算法,即在回收垃圾前对垃圾进行分析和标记,然后这个标记的过程就是关键。

 WeakReference是在下一次gc的时候会将WeakReference所指向的内容回收,然后SoftReference则是在full gc的时候才会将指向的内容回收,那么问题就来了。reference真的这么蠢吗?也就是如果不仅仅只有reference引用了对应的实例,在可达性分析算法的root节点依然有对于这个实例的引用,这种情况下,reference通过get的结果会是空吗?

 怎么可能会是空呢?我们理一下逻辑就可以知道,其实所谓reference的作用其实就仅仅是在回收的时候提供一个标记,即如果在一般gc的情况下,发现某个实例有被softreference引用,那可达性分析就会判定这个对象不应该被回收,即其起到的作用大概可以被归纳为两点:

  • SoftReference可以拯救在gc中本应该被回收的实例
  • WeakReference可以确保一些实例在不需要的时候,及时地被抛弃
class TestReferecnce {@Test@Throws(Exception::class)fun testSomething() {var urlPatternTest:UrlPatternTest? = UrlPatternTest()val reference = WeakReference(urlPatternTest)reference.get().doIfNotNull { println("target exist") }println("execute gc")System.gc()reference.get().doIfNotNull { println("target exist") }reference.get().doIfNull { println("target not exist") }println("\n\nexecute gc after set null")urlPatternTest = nullSystem.gc()reference.get().doIfNotNull { println("target exist") }reference.get().doIfNull { println("target not exist") }}
}
target exist
execute gc
target existexecute gc after set null
target not existProcess finished with exit code

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。

      <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.6.3</version></dependency>

hutool使用文档

https://hutool.cn/docs/#/

hutool使用 WeakReference相关推荐

  1. Android 弱引用 (WeakReference)的使用

    1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...

  2. Hutool,一个贼好用的 Java 工具类库,用过都说好~

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:ryanc.cc/archives/hutool-java- ...

  3. mybatis plus 导出sql_springBoot+mybatisPlus+hutool 实现输入sql导出 excel表格

    支持pom包 com.baomidou mybatis-plus-boot-starter 3.1.1 cn.hutool hutool-all 4.5.10 org.apache.poi poi-o ...

  4. cn.hutool.poi.excel.ExcelUtil 时不时没有数据列

    代码 List<WleUserSaleVo> list = reportWleSaleService.wleUserSaleList(null, vo);ExcelWriter excel ...

  5. WeakReference回收问题

    WeakReference回收问题 这个类算是一种标记,和C的指针给人的感有点像,但是起的作用可能比指针要大.我们都知道,java虚拟机的垃圾回收算法为可达性分析算法,即在回收垃圾前对垃圾进行分析和标 ...

  6. Java 工具集 Hutool 4.0.8 发布

    2019独角兽企业重金招聘Python工程师标准>>> Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以" ...

  7. logincontroller.java_使用HuTool工具类,实现登录验证码

    1.首先引入HuTool的依赖包 cn.hutool hutool-all 4.6.8 2.登录页面 验证码 3.LoginController.java 登录控制器 package com.wang ...

  8. Hutool Java 工具类库导出 Excel,超级简单!

    前言 在开发应用系统的时候,导出文件是必不可放的功能. 以前用过POI.easyexcel等工具的导入导出功能,但总感觉太麻烦了,代码特别多,感觉并不是很好用. 今天给大家介绍一款新工具,java工具 ...

  9. 使用 做签名的post_java组件HuTool相关工具类的使用(五)

    Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法.针对常用工具提供了如:加密解密工具-SecureUtil,Http客户端工具类-HttpUtil,全局定时 ...

最新文章

  1. 已知思科ASA设备漏洞仍在其新版本中存在
  2. [转]ASP.NET页面HEAD区动态设置全攻略
  3. ncurses输出修饰:attron(),attroff(),attrset(),attr_get(),attr_,wattr_,chgat(),mvchgat()
  4. 2008江西高考0分作文
  5. Pytorch基础(二) 初始自动微分
  6. RH850入门教程序言
  7. Rxjava2.X的一些讲解
  8. 详细的世界坐标转屏幕坐标及投影矩阵的推导
  9. double d C语言,1,若有以下定义,char a;int b;float c;double d;... 若有以下语句,则正确的描述是,C语言...
  10. H5前端实现微信分享(处理二次分享问题)
  11. 新房和二手房税费比较
  12. 台式计算机打印机共享,电脑不能共享打印机怎么办 电脑设置共享打印机详细教程...
  13. linux 应用层gpio中断_linux下GPIO中断驱动US100传感器--Apple的学习笔记
  14. html圆角边框背景颜色,CSS之圆角边框渐变的实现
  15. 实验四 MIPS寄存器文件设计 Logisim
  16. 干货丨机器学习/算法19家公司面试心经(内含薪资待遇)
  17. 第8周上机实践项目5——定期存款利息计算器
  18. 3ds-Max2016 安装 无法正常打开win10
  19. bios开发相关网站
  20. mybatis中0被当成空值

热门文章

  1. web flag.php,CTF-WEB:PHP 变量
  2. IT创业失败案例解析 - 第一篇(转)
  3. Android多任务机制的科普(豁然开朗系列)
  4. 打开ie看book!2007电子杂志(样本、目录、画册、商刊)行业国际标准!
  5. LIRe图像检索:CEDD算法原理与源码分析
  6. LINUX 文本命令
  7. Flame Graphs 火焰图安装与使用
  8. Q1营业利润大幅腰斩,露露柠檬靠线上卖瑜伽裤有望止损?
  9. php数字两位小数_PHP数字价格格式化,保留两位小数
  10. huggingface实操_2018 年度 GtiHub 开源项目 TOP 25:数据科学 机器学习