Java虚拟机(二):垃圾回收算法
一、介绍
- GC(Garbage Collection),垃圾收集
- Java中,GC的对象是堆空间和永久区
二、GC算法
1. 引用计数法
- 老牌垃圾回收算法
- 通过引用计算来回收垃圾
- Java中未使用,使用者有COM、ActionScript3、Python
实现:
1> 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;
2> 当引用失效时,引用计数器就减1;
3> 只要对象A的引用计数器的值为0,则对象A就不可能再被使用。

缺点:
- 引用和去引用伴随加法和减法,影响性能
- 很难处理循环引用

2. 标记-清除算法
- 标记-清除算法是现代垃圾回收算法的思想基础。
- 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。
- 实现:
- 在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。
- 在清除阶段,清除所有未被标记的对象。
具体过程如下图所示:

缺点:
- 会产生大量不连续的内存碎片。可能会导致在需要分配较大对象时,无法找到足够的连续的内存空间,而不得不提前进行另一次的垃圾收集动作。
3. 标记-压缩算法
- 标记-压缩算法适合用于存活对象较多的场合,如老年代。
- 它在标记-清除算法的基础上做了一些优化。
- 和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。
- 但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。
- 最后,清理边界外所有的空间。
具体过程如下图所示:

4. 复制算法
- 与标记-清除算法相比,复制算法是一种相对高效的回收方法
- 不适用于存活对象较多的场合 如老年代
- 将原有的内存空间分为两块,每次只使用其中一块
- 在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,
- 之后,清除正在使用的内存块中的所有对象,
- 最后,交换两个内存的角色,完成垃圾回收
具体过程如下图所示:

缺点:
- 空间浪费,内存缩小为原来的一半。
5. 分代收集算法
- 分代收集算法是目前大部分JVM的垃圾收集器采用的算法。
- 依据对象的存活周期进行分类:短命对象归为新生代,长命对象归为老年代。
- 根据不同代的特点,选取合适的收集算法
- 少量对象存活(新生代),适合复制算法
- 大量对象存活(老年代),适合标记清理或者标记压缩

三、Stop-The-World
- Java中一种全局暂停的现象
- 全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互
- 多半由于GC引起
- Dump线程
- 死锁检查
- 堆Dump
GC时为什么会有全局停顿?
类比在聚会时打扫房间,聚会时很乱,又有新的垃圾产生,房间永远打扫不干净,只有让大家停止活动了,才能将房间打扫干净。
危害:
- 长时间服务停止,没有响应
- 遇到HA系统,可能引起主备切换,严重危害生产环境。
Java虚拟机(二):垃圾回收算法的更多相关文章
- 深入理解java虚拟机(二)-----垃圾回收
做一个java程序员很是幸福,不用管不用的对象如何被回收,但是我认为了解一下也不是坏事. 一.如何判断对象已经死亡? 在进行垃圾回收之前,第一件事肯定是判断对象是否已经死亡.1.引用计数算法给对象添加 ...
- 深入理解java虚拟机【垃圾回收算法】
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- Java虚拟机之垃圾回收算法思想总结
1.引用计数法 这是个比较古老而经典的垃圾回收算法,其核心就是在对象被其他所引用的时候计数器加1,而当引用失去时减1.这个方法有非常严重的问题:无法此话有理循环引用的情况,还有就是每次进行加减操作比较 ...
- java虚拟机之垃圾回收算法
标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- JVM学习总结二——垃圾回收算法
昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...
- java虚拟机 之 垃圾回收机制
一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...
- Java中的垃圾回收算法详解
一.前言 前段时间大致看了一下<深入理解Java虚拟机>这本书,对相关的基础知识有了一定的了解,准备写一写JVM的系列博客,这是第二篇.这篇博客就来谈一谈JVM中使用到的垃圾回收算法. ...
- JVM虚拟机和垃圾回收算法
类加载机制 双亲委派模型 垃圾回收算法 CMS G1 类加载机制 双亲委派模型 双亲委派模型: 需要加载一个类,先委托父类加载,父类找父类,依次递归加载;加载不到再由自己加载 垃圾回收算法 JVM的内 ...
随机推荐
- 跟我学Delphi Xe4 开发 IOS 一 , 重读Delphi Xe4 自带文档.
安装了 Delphi Xe4 之后打开这个地址就是完整的官方的文档了. 虽然不是立刻能解决你的问题. 但也是必须要看一遍的. 最基础的都在这里了. ms-help://embarcadero.rs_x ...
- 人生苦短之我用Python篇(安装第三方库、正则表达式)
安装第三方库 两种方法, 一.在DOS界面下运行 pip3 install requests 二.切换至request目录下 cd E:\ python3 setup.py install ----- ...
- 使用Hydra通过ssh破解密码
Hydra是非常高效的网络登录破解工具,它可以对多种服务程序执行暴力破解(SSH.VNC等等). 防止这种攻击其实很容易,方法很多.以SSH为例: Ubuntu:使用Port Knocking隐藏SS ...
- 2018下C程序设计(上)第0次作业
1.翻阅邹欣老师博客关于师生关系博客,并回答下列问题: (1)大学和高中最大的不同是什么?请看大学理想的师生关系是?有何感想? 我认为大学和高中最大的不同在于我们(包括老师)对学习的态度.在高中,学生 ...
- cocos2d-x3.16 default模式项目 Android Studio C++文件编译失败问题
gradle sync正常,但是在编译的时候几乎自己写的Classes里全部c++文件的最后一行都在报错,原来是3.16 模板cpp-template-default内的Android.mk文件内这一 ...
- leetcode_sql_4,196
196. Delete Duplicate Emails Write a SQL query to delete all duplicate email entries in a table name ...
- 在JVM中,新生代和旧生代有何区别?GC的回收方式有几种?server和client有和区别?
在JVM中,新生代和旧生代有何区别?GC的回收方式有几种?server和client有和区别? 2014-04-12 12:09 7226人阅读 评论(0) 收藏 举报 分类: J2SE(5) 一 ...
- webpack+vue-cli搭建项目 (vue项目重构三)
在自己的电脑下载了npm 与 node的情况下 可使用vue-cli快速构建vue项目执行命令如下: # 全局安装 vue-cli$ npm install -g vue-cli# 创建一个基于 &q ...
- Scanner 的练习 。。。。依然不懂用法。。。苦恼
package com.b; import java.util.Random; import java.util.Scanner; public class Core { public static ...
- C# 获取天气 JSON解析
说明: winform获取中国天气的数据 中国天气返回的是JSON数据格式,这里做简单的解析. 用的http://www.weather.com.cn/data/sk/.html获取的天气. [ ...