[jvm]垃圾回收算法

news/2024/7/24 8:31:34 标签: 运维, java

0. 垃圾回收算法概述

标记清除算法
	|
	|--- 标记时间过长
	|		|
	|		|--- CMS:通过初始标记、并发标记和重新标记来拆分标记过程
	|		
	|--- 垃圾回收后,导致内存碎片过多 
			|
			|--- 标记压缩算法:将垃圾移动到一侧来减少内存碎片
			|
			|--- 标记清除算法:将垃圾复制到另一块内存中解决内存碎片
	

  

1. 标记清除算法

工作方式:

1)标记阶段:通过可达性分析[1]查找出与GC Root无直接或间接关联对象,将其标记为待回收对象

2)清除阶段:清除待回收对象

不足:
1)标记和清除两个过程的效率不高;
2)标记清除之后会产生大量不连续的内存碎片。因此,在分配大内存对象时,会因无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
 

  

 

 

2. 标记复制算法

标记复制算法工作原理:将可用内存按容量划分为大小相等的两块,每次只是用其中一块。当这一块内存用完了,就将还存活的对象复制到另外一块上,然后再把已使用过的内存空间一次清除掉。Hotspot将内存分为Eden和两个Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor上,最后清除掉Eden和刚才用过的Survivor空间。当Survivor控件不够用时,需要依赖老年代进行分配担保。目前,HotSpot虚拟机默认Eden和Survivor的大小比例是8:1.
 
 
3. 标记压缩算法
标记压缩算法的工作原理:首先标记出所有需要回收的对象,在标记完成后将所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
 
4. CMS算法 
CMS算法将标记阶段拆分为以下几个步骤:
1)初始标记阶段:将所有工作线程暂停(STW),仅标记与GC Root直接关联的对象
2)并发标记阶段:与工作线程一起工作,标记与GC Root间接关联的对象
3)重新标记阶段:将所有工作线程暂停(STW),修复在初始标记后与GC Root关联关系发生变化的对象
 
 
概念描述:
[1] 可达性分析算法的基本思想:将"GC Roots"对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相相连时,则证明此对象时不可用的。缺点:在检索时,需要将JVM中应用暂停,以便分析无用对象。防止在分析中有无用对象被重新引用。
在Java语言中,可作为GC Roots对象:
1)虚拟机栈(栈帧中的本地变量表)中引用的对象。
2)方法区中类静态属性引用的对象。
3)方法区中常量引用的对象。
4)本地方法栈中JNI引用的对象。

转载于:https://www.cnblogs.com/life91/p/4638801.html


http://www.niftyadmin.cn/n/909757.html

相关文章

Java 从入门到进阶之路(三)

之前的文章我们介绍了 Java 中的变量和基本数据类型,本章我们来看一下 Java 的运算符和表达式。 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组&#x…

8.桥接模式(Bridge Pattern)

using System;namespace ConsoleApplication6 {class Program{static void Main(string[] args){// 创建一个遥控器RemoteControl remoteControl new ConcreteRemote();// 长虹电视机remoteControl.Implementor new ChangHong();remoteControl.On();remoteControl.SetChannel…

TiDB 压力测试报告

(转载自公众号DBATech) 一、测试环境 1、tidb 集群架构: 测试使用最基本的TiDB架构。即 3个tidb-server节点 3个tikv节点 3个pd节点。 2、tidb集群的部署环境(混合部署): 192.168.xx.A 1*server 1*PD 1*tikv 192.168.xx.B 1*serv…

maven打包忽略测试用例

忽略单元测试失败: $ mvn test -Dmaven.test.failure.ignoretrue 跳过单元测试: mvn install -Dmaven.test.skiptrue 跳过测试阶段: mvn package -DskipTests 临时性跳过测试代码的编译: mvn package -Dmaven.test.skiptrue maven…

Java 从入门到进阶之路(四)

之前的文章我们介绍了 Java 的运算符和表达式,本章我们来看一下 Java 的循环结构。 循环是程序设计语言中反复执行某些代码的一种计算机处理过程,是一组相同或相似语句被有规律的重复性进行。 循环的要素: - 循环变量的初始化 - 循环条件&…

[注]十大编程禁忌 -- 程序员都必须克服

程序员在编程的时候难免会犯错误,但如果不从错误中吸取教训,那么习惯成自然,你会经常犯错的。从错误中不断的学习,锻炼好的行为习惯有助于事业上的稳定。 这就是我们如何将小麦从糟糠中区别出来以及如何避免编程禁忌的绝佳经验。此…

Android命令行工具logcat详细用法!

logcat是Android中一个命令行工具,可以用于得到程序的log信息。 见板凳详细说明! 本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB%B5%C4%CB%AE%BD%A7/blog/item/7cc9e1d00715dc369b50271d.html。 【造成的版…

Ubuntu修改时间

Ubuntu修改时区和更新时间 先查看当前系统时间 date -R 结果时区是:0000 我需要的是东八区,这儿显示不是,所以需要设置一个时区 运行 tzselect 在这里我们选择亚洲 Asia,确认之后选择中国(China),最后选择北…