java中堆和垃圾回收机制的介绍

发布时间:2020-07-03 14:55:53

来源:亿速云

阅读:113

作者:元一

这篇文章将为大家详细讲解有关java中堆和垃圾回收机制的介绍,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

堆通常是一个可以被看做一棵树的数组对象。堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆是非线性数据结构,相当于一维数组,有两个直接后继。

堆又叫做 “GC堆,"由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代,比例是1:2;再细致一点新生代内部又划分为Eden区、Survivor区,比例为8:1。

下图显示了堆的结构:

对象在堆中内存的分配是有严格规定的,策略为:对象优先在新生代Eden区分配内存;

大对象直接进老年代,主要是长字符串和数组这些需要大量连续内存空间的对象;

长期存活的对象进入老年代。Eden区内存不够时,JVM发起一次MinorGC,对象的年龄加一,默认对象年龄到15时进入老年代;

动态年龄判定。相同年龄所有对象大小的总和大于 Survivor 空间的一半,大于等于该年龄的对象进入老年代

新生代 GC指Minor GC,在新生代的进行垃圾回收,频繁且快。 老年代 GC(Major GC/Full GC)在老年代进行垃圾回收,通常伴随着至少一次的minor gc。速度慢。Full GC在如下几种情况下都会被触发:老年代空间不足;

方法区空间不足;

调用System.gc(),建议JVM进行full gc;

长期存活的对象转入老年代,空间不足;

没有足够的连续空间分配给大对象;

新生代垃圾回收存活的对象太多,S1放不下,老年代担保空间不足,担保空间指的是老年代最大可用的连续空间是否大于新生代所有对象总空间。

堆里面几乎放了所有的对象,那我们怎么知道这些对象是否还有用呢?JVM提供了两种方法来判定:引用计数法:给对象添加一个引用计数器,每次被引用,计数器值加一,引用失效,计数器值减一,当引用数为0时,表示对象不存活。引用计数法无法解决循环引用问题,周志朋老师书里面有详细的例子,也是比较容易理解的。

可达性分析法:以 ”GC Roots“对象为起始点,就像是树的根节点,向下搜索,搜索走过的路径称为引用链,如果一个对象到 GC Roots起始点没有引用链,则此对象不可达,是需要被回收的。GC Roots是指虚拟机栈引用的对象,本地方法栈引用的对象,方法区静态属性引用的对象,方法区常量引用的对象。

上面提到了引用,对象的存活都和引用有关,引用类型又分为强引用,软引用,弱引用,虚引用。强引用,new出来的对象,垃圾回收器绝不会回收它;

软引用,在系统将要发生OMM前会回收这些对象的内存;

弱引用,垃圾收集器工作时只要发现,马上回收;

虚引用,形同虚设,任何时候都可能被回收。

实际上可达性分析法判定的不可达对象不会马上回收,对象真正被回收需要经过两次标记。第一次标记就是被判定为不可达对象,然后进行一次筛选,筛选条件是此对象是否有必要执行finalize()方法。如果没有重写finalize()方法或者finalize()方法已经被虚拟机调用过,finalize()方法只会被系统调用一次。这两种情况都是”没有必要执行的“。如果有必要,这个对象会被放在F-Quene队列中,由虚拟机自动建立的低优先级的Finalizer线程去执行finalize()方法。这期间GC会对F-Quene中的对象进行第二次小规模标记,如果对象依然没有被引用,那就会被回收,没有被筛选的对象不一定被回收。

我们已经知道对象什么时候被回收了,那如何回收呢?介绍四种最常用的垃圾回收算法:标记-清除:先标记需清除的对象,统一回收----效率不高,会产生大量不连续的碎片;

复制算法:将内存分块,每次只使用一块,使用完后,将存活的对象复制到另一块上;

标记整理:先标记存活对象,然后让所有存活对象向一端移动,直接清理端边界以外的内存;

分代算法,堆分队新生代和老年代,新生代每次收集都会有大量的对象死去,选择复制算法。老年代存活率比较高,且没有额外空间进行分配担保,选择标记清除或者标记整理算法。

垃圾收集算法是一种内存回收的思想,具体的实现是垃圾收集器。简要介绍下常用的垃圾收集器:serial串行收集器。单线程,垃圾回收的时候,必须暂停其他工作。新生复制,老年标记整理。简单高效;

ParNew 收集器。serial的多线程版本;

Parallel Scavenge 收集器,复制算法的多线程收集器。注重吞吐量,cpu运行代码时间/cpu耗时总时间。新生复制,老年标记整理;

Serial Old 收集器,老年代版本;

Parallel Old 收集器,Parallel Scavenge老年代版本;

CMS 收集器,注重最短时间停顿。并发收集器,垃圾收集线程与用户线程(基本上)同时工作。 标记清除算法

关于java中堆和垃圾回收机制的介绍就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

周志朋java_java中堆和垃圾回收机制的介绍相关推荐

  1. 理解JVM中对象与垃圾回收机制

    目录 一.虚拟机中对象的创建过程 1.检查加载 2.分配内存 3.内存空间初始化 4.设置(主要是对象头信息) 5.对象初始化 二.对象的内存布局 三.对象的访问定位 四.判断对象存活 五.各种引用 ...

  2. 深入理解JVM—垃圾回收机制

    一.前言 明确垃圾收集器关注的部分:堆和方法区.着重学习如何确定哪些垃圾需要回收.垃圾回收算法以及GC触发条件. 二.如何确定哪些垃圾需要回收 1.引用计数算法 在对象中添加一个引用计数器,每当有一个 ...

  3. java 虚拟机 Java内存结构 JVM垃圾回收机制算法

    什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 但不一定所有人都知道的是, ...

  4. java中的年轻态,14、Java垃圾回收机制(示例代码)

    垃圾回收原理和算法 ??Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解.Java程序员可以将更多的精力放到业务逻辑上面,而不是内存管量上面,大大的提高了开发效率.这是因为Jav ...

  5. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  6. java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作

    垃圾回收原理和算法 内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可 垃圾回 ...

  7. python有向图_Python 中的垃圾回收机制

    一.概述 python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略. 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的 ...

  8. 简述python垃圾回收机制_python中的垃圾回收机制简述

    2020年12月5日21:47:35 王凯玉 python中的垃圾回收机制 引用计数 # 引用计数 引用计数是编程语言中的一中内存管理技术,可以将资源的被引用次数保存起来. 当引用计数为0时,资源将被 ...

  9. jvm垃圾回收机制_JVM 垃圾回收机制之堆的分代回收

    JVM垃圾回收机制之堆的分代回收 前言 前文我们了解了Java的GC机制,对于堆中的对象,JVM采用引用计数和可达性分析两种算法来标记对象是否可以清除,本文中我们还会了解到JVM将对分成了不同的区域, ...

最新文章

  1. Activity的生命周期是谁调用的?
  2. 32岁的老程序员面试没通过,一问原因,挺突然的...
  3. 上传文件时路径总是C:\fakepath\的问题
  4. unity, 荧光效果(bloom)
  5. C语言中的静态函数的作用
  6. jdk11 jdk12_JDK 12附带紧凑数字格式
  7. 交叉渡线道岔规格_交叉渡线铁路道岔的型号及选用
  8. collections的defaultdict使用
  9. LevelDB源码之五Current文件\Manifest文件\版本信息
  10. Linux 下制作虚拟软盘镜像
  11. LTE 注网流程log分析
  12. 人工智能GIS软件技术体系初探
  13. 2022秋招蚂蚁金服数据研发一面
  14. 前端使用UtoVR Player全景视频播放器实现360°C全景VR视频
  15. iOS截屏后仿今日头条实现一键分享
  16. MySQL - 设计游戏用户信息表
  17. 请求跨域设置同时允许cookie跨域(携带cookie)
  18. API 编排的应用及痛点
  19. python学习——StringIO和BytesIO
  20. 根据微信号,生成微信公众号二维码

热门文章

  1. simulink 风电调频,双馈风机调频,VSG虚拟同步机控制
  2. 开源DMS - 文档管理系统 - logicaldoc 里面转换SWF
  3. javascript根据id 取出元素的值
  4. 【从零开始学习 UVM】10.9、UVM TLM —— TLM Analysis Port
  5. 解决远古VOD使用域名访问时出现“文件服务器未找到”的错误
  6. struts2 漏洞
  7. U880纯GPS定位综合解决方案,支持谷歌地图老虎地图百度地图
  8. 从新认识redis总结
  9. [C#] winform中的DataGridView的列宽设置(自动调整列宽)
  10. 如何使用appletviewer