java gc原理_Java内存管理以及GC工作原理
1、内存管理简介
内存管理的职责为分配内存,回收内存。
没有自动内存管理的语言/平台容易发生错误。
典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。
另一个典型问题为内存泄露,内存已经分配,但是已经没有了指向该内存的指针,导致内存泄露。
程序员要花费大量时间在调试该类问题上。
2、GC简介
因此引入了Garbage Collector机制,由运行时环境来自动管理内存。
Garbage Collector解决了悬挂指针和内存泄露大部分的问题(不是全部)。
注意Garbage Collector(简称Collector)和Garbage Collection(简称GC)的区别。
3、Collector的职责:
分配内存。
保证有引用的内存不被释放。
回收没有指针引用的内存。
对象被引用称为活对象,对象没有被引用称为垃圾对象/垃圾/垃圾内存,找到垃圾对象并回收是Collector的一个主要工作,该过程称为GC。
Collector一般使用一个称为堆的内存池来进行内存的分配和回收。
一般的,当堆内存满或者达到一个阀值时,堆内存或者部分堆内存被GC。
4、好的Collector的特性
保证有引用的对象不被GC。
快速的回收内存垃圾。
在程序运行期间GC要高效,尽量少的影响程序运行。和大部分的计算机问题一样,这是一个关于空间,时间,效率平衡的问题。
避免内存碎片,内存碎片导致占用大量内存的大对象内存申请难以满足。可以采用Compaction技术避免内存碎片。Compaction技术:把活对象移向连续内存区的一端,回收其余的内存以便以后的分配。
良好的扩展性,内存分配和GC在多核机器上不应该成为性能瓶颈。
5、GC性能指标
Throughput: 程序时间(不包含GC时间)/总时间。
GC overhead: GC时间/总时间。
Pause time: GC运行时程序挂起时间。
Frequency of GC: GC频率。
Footprint: a measure of size, such as heap size。
Promptness:对象变为垃圾到该垃圾被回收后内存可用的时间。
依赖于不同的场景,对于GC的性能指标的关注点也不一样。
6、分代GC
分代GC把内存划分为多个代(内存区域),每个代存储不同年龄的对象。 常见的分为2代,young和old。
分配内存时,先从young代分配,如果young代已满,可以执行GC(可能导致对象提升),如果有空间,则分配,如果young代还是没有空间,可以对整个内存堆GC。
young代GC后还存活的对象可以提升到old代。
该机制基于以下观察事实:
1 大部分新分配的对象很快就没有引用了,变成垃圾。
2 很少有old代对象引用young代对象。
基于代内存存储对象的特性,对不同代的内存可以使用不同的GC算法。
Young代GC需要高效,快速,频繁的执行,关注点主要在速度上。
Old代由于增长缓慢,因此GC不频繁,但是其内存空间比较大,因此,需要更长时间才能执行完GC。关注点在内存空间利用率上。
7、Java Collector
Jvm的内存分为3代。Young, Old, Permanent。
大部分对象存储在Young代。
在Young代中经历数次GC存活的对象可以提升到Old代,大对象也可以直接分配到Old代。
Permanent代保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。
Young代由一个Eden和2个survivor组成。大部分的对象的内存分配和回收在这里完成。
Survivor存储至少经过一次GC存活下来的对象,以增大该对象在提升至old代前被回收的机会。2个survivor中有一个为空。分别为From和to survivor。
当young代内存满,执行young代GC(minor GC)。
当old或permanent代内存满,执行full GC(major GC),所有代都被GC。一般先执行young GC,再执行old, permanent GC。
有时old代太满,以至于如果young GC先运行,则无法存储提升的对象。这时,Young GC不运行,old GC算法在整个堆上运行(CMS collector是个例外,该collector不能运行在young 代上)。
java gc原理_Java内存管理以及GC工作原理相关推荐
- java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- java session原理_java web开发—session的工作原理总结
session的工作原理总结 一.什么是session session是一次浏览器和服务器交互的会话,在jsp中,作为一个内置对象存在.我的理解,就是当用户打开网页时,程序会在浏览器中开辟一段空间来存 ...
- java过滤器的原理_Java 三大器之过滤器(Filter)工作原理
Filter 简介 filter称为过滤器,可以对web 服务器管理的所有资源: Jsp, Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访 ...
- Java 内存管理、JVM 工作原理与 Java 运行时系统
Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...
- 阅读micropython源码-内存管理组件GC
阅读micropython源码-内存管理组件GC 苏勇,2021年8月 文章目录 阅读micropython源码-内存管理组件GC 初探micropython中的内存管理机制 分析指定的内存相关参数 ...
- Java虚拟机JVM的内存管理
Java虚拟机JVM的内存管理 关键词 一.JVM整体架构 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 名称 作用 特征 配置参数 异常 程序计数器 ...
- 深入理解Java虚拟机|JVM02-自动内存管理
深入理解Java虚拟机 第2章 Java内存区域与内存溢出异常 2.2运行时数据区域 2.1.1 程序计数器 2.1.2 Java虚拟机栈 变量的分类: 局部变量表 操作数栈 动态链接 方法返回地址 ...
- 加密机工作原理_端子机压力检测装置工作原理
上期我们介绍了端子机压力管理装置的使用常识,这期我们介绍端子机压力管理装置的工作原理,端子机压接管理装置,有单通道压力监测和双通道压力监测二种,双通道压力监测装置,一般用于双头端子压接机上,一台主机可 ...
- 【原理】#01红外热成像仪的工作原理介绍
红外热成像仪是电测中比较特殊的一种仪器设备,在温度测试领域有着广泛的应用. 红外热成像仪测温的原理是怎么样的?如何选择合适的热成像仪? 安泰小课堂将分两期视频为大家进行揭秘. 本期内容将重点讲解红外热 ...
最新文章
- 春愁(shunshu)—Mrs. Green Apple (歌词、汉译、罗马音)
- java源码之HashMap和HashTable的异同
- orika java_使用orika进行对象间Mapping
- zabbix的源码安装
- AI算法工程师的一些含泪经验
- ArcMAP 启动要素构造工具条
- SqlBulkCopy做大数据插入
- Atitit 云计算体系树.docx Atitit 云计算之道 attilax著 艾龙 著 serverless bomb 1. 什么才是云计算的根本特征..	2 2. 云计算体系	2 3. “云
- js工具栏悬浮提示文字js特效
- android在ctwap下播放视频,退出播放,切换到ctnet下,视频一直缓冲无法播放
- c语言数组升序排列,数组输入各数之间用空格隔开,输出用空格隔开
- 图像处理之opencv图片几何变化操作大全
- 小船过河(贪心算法)
- 【二次开发】如何使用C#进行CATIA二次开发
- 「Java数据结构」手撕数组队列及环形数组队列。
- 微信小程序使用字体图标的方法iconfont
- LocalDate加减操作及比较大小
- layui框架KIT ADMIN后台管理系统模板
- 视频编码,各种参数~sps ,pps ,nalu ,frame ,silce ect....
- 煤矿无线广播系统解决方案