GC和内存模型一样,和实现有关。这里介绍的是一些基本原理以及hotspot的实现。java7还存在永久代,java8把永久代移除了。在最后一点有提到。
 
        一。基本概念

1.堆区从运行分配的角度分为java堆(用于对象内存的分配)和方法区(类信息等)。但是从另一个

视角,生命周期的角度,堆区分为年轻代、年老代、永久代。永久代即方法区。基本没有GC

2.GC视角的堆区如下图(图转自csdn):
           年轻代分为:
Eden区
S0区(Survivor区1、from区)
S1区(Survivor区2、to区)
           年老代:一整块大区
           永久代:即方法区
3.年轻代的GC叫minor GC。当年轻代空间不够时触发minor GC
年老代的GC叫major GCfull GC。当年老代空间不够时触发major GC。现在一般的做法是,
在进行major GC之前,先进行一次minor GC。把不需要的对象先清理掉,这样年老代相关对象也
可能不需要了
        二。对象生命周期

Eden区

From区

To区

Old区

Perm区

一般对象都被创建在Eden区(特别大的会直接创建在Old区)

一次minor GC后仍存活的对象,会从Eden区被移到From区或To区

同样,From区会被移到To区或者To区会被移到From区

(所以具体移到哪个区看当前情况,一次minor GC后,Eden区和Survivor区中的某一个,一定是空的,一定是空的)

当经过一定次数(默认15次)的minor GC后仍然存活的对象,会被移到Old区

        三。GC算法纬度

串行GC——暂停应用程序线程,使用单CPU进行处理

并行GC——暂停应用程序线程,使用多CPU,将任务分成多个子任务,并行处理

并发GC——不暂停应用程序线程,GC与应用程序并发处理

        四。GC算法

图均转自CSDN

1.标记清除(Mark-sweep)——先标记不用的后清除。但是效率低、会产生大量碎片

2.复制(Copying)——内存分两块区域,每次只使用一块区域,GC时把正在使用的(即不能

被清除的)复制到另一块去。效率不错,且不会碎片化——需要两倍的空间

3.标记整理(Mark-Compact)——先标记不用的,然后压缩到一起。避免了碎片。

4.CMS——一般用于年老代

CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停,它的收集周期是这样:

(1)初始标记(CMS-initial-mark):单线程,从GC Root寻找直达的对象,速度快,需暂停

(2)并发标记(CMS-concurrent-mark):与应用线程一起运行,是CMS最主要的工作阶段,

通过直达对象,扫描全部的对象,进行标记

(3)重新标记(CMS-remark):修正并发标记时由于应用程序还在并发运行产生的对象的修改,

多线程,速度快,需要全局停顿

(4)并发清除(CMS-concurrent-sweep):与应用程序一起运行

(5)并发重设状态等待下次CMS的触发(CMS-concurrent-reset)。

CMS为何采用清除而不是压缩?

CMS主要关注低延迟,因而采用并发方式,清理垃圾时,应用程序还在运行,如果采用压缩,

则涉及到要移动应用程序的存活对象,此时不停顿,是很难处理的,一般需要停顿下,移动存活

对象,再让应用程序继续运行,但这样停顿时间变长,延迟变大 ,所以CMS采用清除算法。

        五。算法选择

年轻代(Eden+Survivor To+Survivor From)使用复制(Copying)算法。可配置串行或并行。

年老代使用标记整理(Mark-Compact)算法。可选择串行。可配置串行或并行。另可配置为使用CMS

        六。垃圾检测算法

1.引用计数法——给一个对象添加引用计数器,每当有个地方引用它,计数器就加1;引用失效就减1。

但是,如果我有两个对象A和B,互相引用,除此之外,没有其他任何对象引用它们,实际上这

两个对象已经无法访问,即是我们说的垃圾对象。但是互相引用,计数不为0,导致无法回收

2.可达性分析算法——以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象。

这里的根集一般包括java栈中引用的对象、方法区常良池中引用的对象、本地方法中引用的对象等。

        七。关于持久代

Java8开始。持久代被移除了,改用Metaspace。底层存储应该还是堆,只不过分开管理,单独的

内存分配单独的GC等。脱离开JVM调优范围。

转载于:https://www.cnblogs.com/keita/p/8583226.html

JVM简介(三)——GC相关推荐

  1. Jvm 系列(三):GC 算法 垃圾收集器

    这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理. 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 ...

  2. jvm系列(三):GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...

  3. Java虚拟机JVM简介与理解(三)

    Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...

  4. JVM的三种常见GC:Minor GC、Major GC与Full GC

    文章目录 JVM的GC JVM GC的种类 GC的触发机制 年轻代GC(Minor GC)触发机制 老年代GC(Major GC/Full GC)触发机制 Full GC触发机制 为什么需要把Java ...

  5. JVM(三)GC垃圾回收以及四种GC算法

    JVM(三) 学习视频链接,以示尊重:https://www.bilibili.com/video/BV1iJ411d7jS?p=4 图片来源:https://blog.csdn.net/weixin ...

  6. JVM为什么需要GC

    社区内有人发起了一个讨论,关于JVM是否一定需要GC?他们认为应用程序的回收目标是构建一个仅用来处理内存分配,而不执行任何真正的内存回收操作的 GC.即仅当可用的 Java 堆耗尽的时候,才进行顺序的 ...

  7. JVM——成为Java GC专家(1)

    原文: Understanding Java Garbage Collection JVM--成为Java GC专家(1) 理解Java垃圾回收机制(GarbageCollection,简称GC)是如 ...

  8. JVM学习之GC常用算法

    2019独角兽企业重金招聘Python工程师标准>>> 出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了 ...

  9. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  10. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

最新文章

  1. 用python做一个图片验证码
  2. python代码根据时间获取周数(week of the year)
  3. torch.nn.Linear
  4. java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.init(L
  5. 触发器——创建||更新||删除||查看
  6. java发送http请求的四种方式
  7. Android之jni编译出现multiple definition of ‘××××ב
  8. 【修炼5】《基础篇》别把项目成功当目标
  9. thymeleaf模板的应用
  10. Hyper-V上Linux的鼠标驱动
  11. 学习帮——提高智商、改善记忆力的120种绝佳方法!
  12. 本特利振动探头177230-01-01-CN
  13. NTC热敏电阻应用-测温
  14. 手机与计算机之间的文件传输,电脑与手机如何快速传输文件
  15. Skleran-线性模型-普通最小二乘法-LinearRegression
  16. 使用FFmpeg工具将一个图片和一个音频合成一个视频以及在window系统下使用脚本运行
  17. 过滤器,监听器,拦截器的区别
  18. 如何清除博客中广告内容
  19. SICP读书笔记 3.1
  20. 嵌入式的日常工作内容是什么?

热门文章

  1. 移动端软件测试要点,移动端测试用例设计总结
  2. 协议圣经 -协议之服务编写(九)
  3. threejs基础示例
  4. spring boot 整合Dubbo/Zookeeper
  5. 【kafka】kafka 控制台 消费 ip 却找 域名 报错 Can‘t resolve address UnresolvedAddressException
  6. 【Elasticsearch】 es Bootstrap Checks Failed
  7. 【SpringCloud】Spring cloud Alibaba Nacos 服务注册与配置中心 命名空间 Data Id
  8. 【elasticsearch】elasticsearch 生命周期 resourceAlreadyExistsException
  9. 【高并发】java JUC中的Semaphore(信号量)
  10. 【Kafka】kafka报错 UnknownHostException: %HOSTGROUP::host_group_zookeeper%: Temporary failure in name re