JVM简介(三)——GC
1.堆区从运行分配的角度分为java堆(用于对象内存的分配)和方法区(类信息等)。但是从另一个
视角,生命周期的角度,堆区分为年轻代、年老代、永久代。永久代即方法区。基本没有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相关推荐
- Jvm 系列(三):GC 算法 垃圾收集器
这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理. 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 ...
- jvm系列(三):GC算法 垃圾收集器
概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...
- Java虚拟机JVM简介与理解(三)
Java虚拟机JVM简介与理解(三) 问题背景 PC程序计数器 虚拟机栈 本地方法栈 堆 元空间 方法区 运行时常量池 直接内存 Lyric: 彻底把我囚禁在你的呼吸 问题背景 Java虚拟机JVM简 ...
- JVM的三种常见GC:Minor GC、Major GC与Full GC
文章目录 JVM的GC JVM GC的种类 GC的触发机制 年轻代GC(Minor GC)触发机制 老年代GC(Major GC/Full GC)触发机制 Full GC触发机制 为什么需要把Java ...
- JVM(三)GC垃圾回收以及四种GC算法
JVM(三) 学习视频链接,以示尊重:https://www.bilibili.com/video/BV1iJ411d7jS?p=4 图片来源:https://blog.csdn.net/weixin ...
- JVM为什么需要GC
社区内有人发起了一个讨论,关于JVM是否一定需要GC?他们认为应用程序的回收目标是构建一个仅用来处理内存分配,而不执行任何真正的内存回收操作的 GC.即仅当可用的 Java 堆耗尽的时候,才进行顺序的 ...
- JVM——成为Java GC专家(1)
原文: Understanding Java Garbage Collection JVM--成为Java GC专家(1) 理解Java垃圾回收机制(GarbageCollection,简称GC)是如 ...
- JVM学习之GC常用算法
2019独角兽企业重金招聘Python工程师标准>>> 出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了 ...
- JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)
转载自 JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...
- JVM内存管理------GC算法精解(复制算法与标记/整理算法)
转载自 JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...
最新文章
- 用python做一个图片验证码
- python代码根据时间获取周数(week of the year)
- torch.nn.Linear
- java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.init(L
- 触发器——创建||更新||删除||查看
- java发送http请求的四种方式
- Android之jni编译出现multiple definition of ‘××××ב
- 【修炼5】《基础篇》别把项目成功当目标
- thymeleaf模板的应用
- Hyper-V上Linux的鼠标驱动
- 学习帮——提高智商、改善记忆力的120种绝佳方法!
- 本特利振动探头177230-01-01-CN
- NTC热敏电阻应用-测温
- 手机与计算机之间的文件传输,电脑与手机如何快速传输文件
- Skleran-线性模型-普通最小二乘法-LinearRegression
- 使用FFmpeg工具将一个图片和一个音频合成一个视频以及在window系统下使用脚本运行
- 过滤器,监听器,拦截器的区别
- 如何清除博客中广告内容
- SICP读书笔记 3.1
- 嵌入式的日常工作内容是什么?
热门文章
- 移动端软件测试要点,移动端测试用例设计总结
- 协议圣经 -协议之服务编写(九)
- threejs基础示例
- spring boot 整合Dubbo/Zookeeper
- 【kafka】kafka 控制台 消费 ip 却找 域名 报错 Can‘t resolve address UnresolvedAddressException
- 【Elasticsearch】 es Bootstrap Checks Failed
- 【SpringCloud】Spring cloud Alibaba Nacos 服务注册与配置中心 命名空间 Data Id
- 【elasticsearch】elasticsearch 生命周期 resourceAlreadyExistsException
- 【高并发】java JUC中的Semaphore(信号量)
- 【Kafka】kafka报错 UnknownHostException: %HOSTGROUP::host_group_zookeeper%: Temporary failure in name re