Java虚拟机垃圾收集算法
1、标记-清除算法
标记-清除算法分为 “标记” 和 “清除” 两个步骤:首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象,是垃圾收集算法中的最基础的收集算法。
缺点:一、标记和清除两个步骤效率都不高;二、清除后产生大量不连续的内存空间,空间碎片太多产生可能会导致以后在程序运行过程中需要分配较大的对象时,无法找到足够的连续空间而不得不触发一次垃圾收集动作。
2、复制算法
复制算法将可用的内存按照容量大小分为大小相等的两块,每次只使用其中的一块,当这一块使用完了之后,就将还存活的对象复制到另一块内存上,然后再把已使用过的内存空间一次性清理掉。
优点:实现简单,运行效率高;
缺点:可用内存缩小了一半,代价大;
现在商业虚拟机都采用这种收集算法来回收新生代,因为根据IBM公司的研究,新生代中的对象98%是 “朝生夕死” 的,所以不需要按照 1:1 的比例来划分内存空间,而是将内存划分为一块较大的Eden空间和两块较小的Survivor空间,每次只使用Eden和其中一个Survivor,当回收时,将Eden和Survivor中还存活的对象一次性复制到另一个Survivor空间。HotSpot虚拟机默认 Eden与Survivor空间的比例是8:1。
3、标记-整理算法
复制算法在对象存活率较高时需要进行多次复制操作,效率将会变低。更是为了节省内存,根据老年代的特点,出现了 "标记-整理" 算法。
标记-整理算法分为 “标记” 和 “整理” 两个步骤:首先标记出所有需要回收的对象,然后在标记完成之后让存活的对象都要都向内存的一端移动,最后清理掉端边界以外的内存。
4、分代收集算法
根据各个年代的特点,不同的年代采用不同的收集算法。
在新生代,每次垃圾收集时发现有大量对象死去,只有少量的存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
在老年代,由于对象存活率高、没有额外空间对它进行担保,就必须使用 “标记-清理” 或者 “标记-整理” 算法来进行回收。
转载于:https://www.cnblogs.com/super-jing/p/10790733.html
Java虚拟机垃圾收集算法相关推荐
- 读书笔记--Java虚拟机垃圾收集算法
前言 熟悉虚拟机的垃圾收集算法有助于我们更好的了解Java内存的分配策略.对我来说,以前也有去了解过虚拟机相关的知识点,但是比较零碎.这次拜读<深入理解Java虚拟机>,真是相当后悔自己为 ...
- Java虚拟机垃圾收集器初步学习
Java虚拟机-垃圾收集器 1.概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 这里讨论的收集器基于JDK 1.7 Update 14之后的HotSpot虚拟机 ...
- Hotspot虚拟机- 垃圾收集算法和垃圾收集器
引言 声明:由于CSDN不支持Hexo支持的Markdown语法,大家看到{% asset_img 1st.png Mark and Sweep %}这样的标签时,就是一张图片.由于图片较多,我就不一 ...
- 读书笔记——Java虚拟机垃圾收集器与内存分配策略
本文章已授权微信公众号郭霖(guolin_blog)转载. 本文章讲解的内容是Java虚拟机垃圾收集器与内存分配策略. 概述 说起垃圾收集(Garbage Collection),也就是GC,大部分人 ...
- Java虚拟机------垃圾收集器
JVM系列最核心的文章没有之一: 引用 强引用 只要引用存在,垃圾回收器就永远不会回收.当内存空足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引 ...
- 深入理解Java虚拟机——垃圾收集器与内存分配策略
文章目录 对象已死? 引用计数算法 可达性分析算法 再谈引用 强引用: 软引用: 弱引用: 虚引用: 回收方法区 垃圾收集算法 标记 - 清除算法 缺点: 标记 - 复制算法 标记 - 整理算法 分代 ...
- Java虚拟机:垃圾收集
一.对象的生命周期 java对象在虚拟机中经过三个过程: 1.首次加载类型 => 初始化类变量 2.创建对象 (有四种方式) 2.1 new 操作 2.2 Class或java.lang.r ...
- 深入理解Java虚拟机—Java虚拟机内存
之前的内容: 上一篇:深入理解Java虚拟机-Java历史以及Java虚拟机历史 下一篇:深入理解Java虚拟机-垃圾收集算法 一.运行时数据区分为五个区域 1. 程序计数器 他可以看作是当前线程所执 ...
- java虚拟机学习笔记之垃圾收集(下)
★引用计数收集器 这种方法中,堆中每个对象都有一个引用计数.当一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被设置成1.当这个对象的引用赋值给其他任何一个变量的时候,这个变 ...
最新文章
- SQL JOIN 中 on 与 where 有何区别
- Index.get_indexer 方法的含义
- 大话数据结构顺序表和链表
- JDBC基本知识总结概括及8个阶段优化过程:
- 基础编程题目集 7-4 BCD解密 (10 分)
- MySQL Workbench工具设置编码
- 权限设计(资源权限和数据权限)
- PDA地下电缆巡检系统
- matlab griddata外插,matlab griddata方法使用介绍
- STM32驱动_LCD1602
- Redis穿透、击穿、雪崩解决方案
- wps设置页码,从某一页重新开始编号
- Freeswitch连接SIP软电话
- 树莓派41/100- Pico控制触摸开关模块TTP223
- 人生不该有如此压力,来吃下这口缓解焦虑的良药[50P]
- 公共数据库介绍~OECD经合组织数据库
- redis 集群 哨兵
- SIKI学习——贪吃蛇案例05
- 用Python写一个新年倒计时
- Spring——》谈谈你对Spring框架的理解
热门文章
- android用户界面之菜单(Menu)教程实例汇总
- 专题8-Linux系统调用
- xp下安装sqlserver 2000的解决方案
- linux的tar中ztvf,linux中的tar命令(2)
- 线性回归算法原理简介
- linux ssh权限漏洞,OpenSSH do_setup_env函数权限提升漏洞(CVE-2015-8325)
- 计算机应用基础教材编写建议,【计算机应用论文】计算机应用基础校本教材编写研究(共3136字)...
- 电子计算机原理讲义,计算机原理讲义
- mac访问linux桌面文件夹路径,mac下“远程桌面”访问linux
- Java面试之Java基础下册(含答案)