JAVA虚拟机垃圾回收算法原理
除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间。请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间是足够的。这是因为,堆中没有连续的空闲空间放得下新的对象。
垃圾收集器算法
任何垃圾回收算法都必须做两件事,首先,它必须检测出垃圾对象。其次,它必须回收垃圾对象所使用的堆空间并还给程序。从根对象开始,任何可以被触及的对象都被认为是“活动的”对象(如果正在运行的程序可以访问到根对象和某个对象之间存在引用路径,这个对象就是可触及的)
(1)引用计数收集器
是垃圾回收的早期策略,在这个方法中,堆中每一个对象都有一个计数器。当一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数器被置为1。
当任何其他变量被赋值为对这个对象的引用时,计数加1.
当一个对象的引用超过了生命期或者被设置一个新的值时,对象的引用计数减1.
任何引用计数器为0的对象可以被当作垃圾收集。
优点:引用计数器可以交织在程序之中,对于程序不能被长时间打断的实时环境很有利。 缺点:引用计数无法检测出循环(即两个或者更多的对象相互引用)
(2)跟踪收集器
从根节点开始的对象引用图,在追踪过程中遇到的对象以某种方式打上标记。要么在对象本身设置标记,要么用一个独立的位图来设置标记。当追踪结束后,未被标记的对象就知道是无法触及的,从而可以被垃圾回收。
JAVA虚拟机的垃圾收集器可能有对付堆碎块的策略。标记并清除收集器通常使用的两种策略是压缩和拷贝。 其实现原理是快速地移动对象来减少堆碎块。压缩收集器把活动的对象越过空闲区移动到堆的另一端,那么在堆的另一端就出现一个大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。(对象的引用实际上指向一个对象句柄表。对象句柄才指向堆中对象的实际位置。当对象被移动了,只有这个句柄需要被更新为新位置。所有的程序中对这个对象的引用仍然指向这个具有新值的句柄,而句柄本身没有移动。
优点:简化了消除堆碎块的工作。 缺点:每一次对象访问都带来了性能的损失。
(3)拷贝收集器
把所有的活动对象移动到一个新的区域。在拷贝的过程中,它们是紧挨着布置,消除原本它们在旧区域的空隙。对象被快速拷贝到一个新的区域,同时转向指针仍然留在原来的位置。转向指针可以让垃圾收集器发现已经被转移的对象的引用。然后垃圾收集器可以把这些引用设置为转向指针的值,所以它们现在指向对象的新位置。 这个算法的特点是"停止并拷贝"。任何时候都只使用一个区域,对象在同一个区域中分配,直到这个区域被耗尽。此时,程序执行被终止,堆被遍历,遍历时遇到的活动对象被拷贝到另一个区域。当停止和拷贝过程结束,程序恢复执行。
优点:对象可以在从根对象开始的遍历过程中随着发现被拷贝,不再有标记和清除的区分。 缺点:要分配两倍的堆内存,每次都把生命周期很长的对象来回拷贝,消耗大量的时间。
(4)按代收集的收集器
通过把对象的寿命来分组解决拷贝收集器的效率低下的问题。在这个方法里,堆被分为两个或者更多的子堆,每一个子堆为一"代"对象服务。最年幼的那一代进行最频繁的垃圾收集。如果一个最年幼的对象经历了好几次的垃圾回收依旧存活,那么这个对象就成长为寿命最高的一代。被转移到另一个子堆中去。
(5)自适应收集器
自适应算法监视堆中的情形,并且对应地调整为合适的垃圾收集技术。
以上垃圾回收机制都会造成程序的中断-运行的过程,并不适用于实时性比较高的系统。
参考:《深入java虚拟机》
JAVA虚拟机垃圾回收算法原理的更多相关文章
- java虚拟机-垃圾回收算法
在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理.但是首先需要明确,什么样的对象才能当为垃圾: 1.引用计数法:如果某个引用(即指针)指向对象,那么说明该对象还 ...
- 了解java虚拟机—垃圾回收算法(5)
引用计数器法(Reference Counting) 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器减1.只要对象A的引用计数器的 ...
- Java虚拟机—垃圾回收算法(整理版)
1.概述 由于垃圾收集算法的实现涉及大量的程序细节.因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程.主要涉及的算法有标记-清除算法.复制算法.标记-整理算法.分代收集算法. 2 ...
- Java虚拟机垃圾回收(二) :垃圾回收算法(转载)
1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...
- Java虚拟机垃圾回收(三) 7种垃圾收集器
Java虚拟机垃圾回收(三) 7种垃圾收集器 主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java ...
- Java虚拟机垃圾回收:基础点(转载)
1.Java虚拟机垃圾回收 垃圾回收,或称垃圾收集(Garbage Collection,GC)是指自动管理回收不再被引用的内存数据. 在1960年诞生于MIT的Lisp语言首次使用了动态内存分配和垃 ...
- ☕【JVM技术指南】「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"【下部】
承接上文 (完结撒花1-52系列)[JVM技术指南]「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"[上部] 并行收集器 并行收集器(也称为吞吐量收集器)是类似 ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- Java虚拟机垃圾回收(三): 7种垃圾收集器(转载)
1.垃圾收集器概述 垃圾收集器是垃圾回收算法(标记-清除算法.复制算法.标记-整理算法.火车算法)的具体实现,不同商家.不同版本的JVM所提供的垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚 ...
随机推荐
- Java数据库操作
一.JDBC 1.JDBC Java数据库连接,用于Java程序中实现数据库操作功能,java.sql包中提供了执行SQL语句,访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口及类. 2. ...
- 运用vertical:middle 使得元素垂直居中
我要垂直居中我要垂直居中我要垂直居中我要垂直居中我要垂直居中垂直居中垂直居中垂直居中中垂直居中垂直居中 <!-- 第一步:主题元素display:inline-block;第二步:插入辅助元 ...
- 在 Ubuntu 14.04 中配置 PXE 服务器
PXE(预启动执行环境Preboot Execution Environment)服务器允许用户从网络中启动 Linux 发行版并且可以不需要 Linux ISO 镜像就能同时在数百台 PC 中安装. ...
- enmo_day_07
数据备份 物理备份 : 底层数据块 逻辑备份 :exp(export), imp(import) 导入导出工具,提取成dump文件,再将dump文件放入数据库 expdp, impdp 数据蹦 uti ...
- Linux下Tomcat的安装配置
一.下载安装对应的jdk,并配置Java环境. 官网下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-dow ...
- 58.com qiyi
using AnfleCrawler.Common; using System; using System.Collections.Generic; using System.Linq; using ...
- HDU 4734 F(x)
这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法
苹果这狗日的,手段果然狠,因为用户提前升级了测试版又没有更新正式版,就突然把手机变砖头,既不让升级正式版,也不让备份手机中的信息,确实有必要这样吗? 我的手机是IPone4s,在看了6月Apple W ...
- php-数据库访问--数据修改
主页面元素修改脚本 <?php $code = $_GET["c"]; //造连接对象 $db = new MySQLi("localhost",&quo ...
- Spring4 + Quartz-2.2.0集成实例
Spring3.0不支持Quartz2.0,因为org.quartz.CronTrigger在2.0从class变成了一个interface造成IncompatibleClassChangeError ...