垃圾收集算法学习

前言:作为学习java虚拟机的基础,垃圾算法必须了解其实现原理。

1、标记-清除算法 ,最基础的算法,之所以说基础,所有的算法是在它基础上改进,它分为标记和清楚两个部分,首先标记,对所有的可回收对象标记一下,然后回收 。

两个步骤效率都很低。最大的缺点是。清除后产生很多不连续的碎片,如果一个大对象,进入内存,则不能被分配,造成再一次垃圾回收。

 2、复制算法,为了避免这种不连续的碎片,采用了分区。分为三个区,edon, from survivor ,to survivor ,新生的对象一开始全被分配到edon 区 。from suivivor,存活的上次回收后还没达到能进入老年代的对象(有个计数器,一个对象默认被使用15 次进入老年代,当然大对象直接进入老年代),当内存满了,促发垃圾回收,这里的垃圾回收是minor GC,会把edon 区 和from survivor区 的存活的对象全部复制到了to survivor ,当然,回收之后,from suivivor 和to survivor名称就对换了。之所以这样做我个人认为survivor上有个计数器用于记录对象的使用次数一般的默认edon和survivor比例是8:1.edon区加两个survivor区之和为新生代,这种算法保证每次新生代能使用的内存为虚拟机配置的百分之90%。当survivor空间不够时会通过内存担保机制直接进入老年代,并且,当垃圾回收的时候to survivor不够,即 没有达到15 次在新生代的对象和 from survivor 区存活的对象大于to survivor区最大内存,也会被分配到老年代。

3、标记-整理算法 , 把 所有的还在使用的对象标记和全放到一端,然后清除,保证不会出现内存不连续。

   
   

4、分代收集算法,这个算法是根据对象的存活周期把内存分为几块,一般是新生代,老年代。新生代对象存活率短,用复制算法。老年代用标记-清除,标记-整理算法

时间: 2024-10-10 10:16:51

垃圾收集算法学习的相关文章

J深入学习ava虚拟机之——垃圾收集算法与垃圾收集器

今天我们将一起学习Java虚拟机使用垃圾收集算法和常见的垃圾收集器.Java虚拟机内存区域的程序计数器.虚拟机栈和本地方法栈3个区域是随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出出栈和入栈.每一个栈帧中分配多少内存基本上是在类结构确定下来的时候就已知的,因此这个几个区域的内存分配和回收都具备确定性,在这几个区域就不需要过多考虑回收问题,因为方法结束或者线程结束时,内存自然就跟着回收了.而Java堆和方法区就不一样,一个接口中的多个类实现需要的内存可能不一样,一个方法中的多个分支需要的内

学习-垃圾收集算法

垃圾收集算法 1.标记-清除算法 首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象.缺点: 效率问题,标记和清除过程的效率都不高: 标记清除之后会产生大量不连续的内存碎片: 2.复制算法 将可用内存按容量划分为大小相等的两块,每次只使用其中的一块.当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉.缺点: 将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低. 3.标记-压缩算法 标记过程仍然与"标记-清除"算法

大话JVM(一):垃圾收集算法

 系列介绍|本系列主要是记录学习jvm过程中觉得重要的内容,方便以后复习 在说垃圾收集算法之前,先要说一下垃圾收集,从大的讲,垃圾收集需要考虑三件事情: 1.哪些内存需要回收 2.什么时候回收 3.如何回收 JVM在执行java程序时,把他管理的内存分为多个数据区域: 1.程序计数器(记录程序执行到哪了,各线程之间独立存储, 互不影响) 2.虚拟机栈(这个栈就是我们常说的jvm的“堆”和“栈”中的栈,这里存放的是编译期间可知的各种数据类型(8种基本类型).对象引用(reference类型,就是一

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历

表达树就是根据后缀表达式来建立一个二叉树. 这个二叉树的每个叶子节点就是数,真祖先都是操作符. 通过栈来建立的,所以这里也会有很多栈的操作. 树的先序遍历,中序遍历,后序遍历的概念我就不讲了,不会的自行百度,不然也看不懂我的代码. 下面是代码: // // main.cpp // expressionTree // // Created by Alps on 14-7-29. // Copyright (c) 2014年 chen. All rights reserved. // #includ

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

算法学习三阶段

?? 第一阶段:练经典经常使用算法,以下的每一个算法给我打上十到二十遍,同一时候自己精简代码, 由于太经常使用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都能够把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal 要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同一时候熟练hash 表(要熟,要灵活,代码要

JVM垃圾回收2(垃圾收集算法)

根据<深入理解java虚拟机>这本书总结 一.关于几个概念:(标记垃圾算法.垃圾收集算法.垃圾收集器) 前面说了如何寻找jvm垃圾,有两种方法:引用计数法/可达性算法.这篇准备讲,标记完垃圾之后,回收的算法,这里的算法只是垃圾回收的思想.后面会讲到多种垃圾收集器,这里的垃圾收集器就是运用了垃圾手机算法的思想,可以说是具体实现. 这里还是想多余的说一下这三个概念: 垃圾标记算法:标记垃圾的方法 垃圾收集算法:一种回收思想,供垃圾收集器使用.可能用在年轻代,也可能用在老年代(当然现在来说老年代和年

周总结(2017.2.16):第一周算法学习。

周总结:算法学习总结之DFS和BFS 一:DFS算法 目的:达到被搜索结构的叶节点. 定义:假定给定图G的初态是所有的定点都没有访问过,在G中任选一定点V为初始出发点,首先访问出发点并标记,然后依次从V出发搜索V的每个相邻点W,若W未曾出现过,则对W进行深度优先遍历(DFS),知道所有和V有路径相通的定点被访问. 如果从V0开始寻找一条长度为4的路径的话: 思路步骤: 先寻找V0的所有相邻点:dis{v1,v2,v3},V1没有访问过,所以对V1进行深度遍历并将V1标记为访问过,此时路径长度为1

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划 我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++) 这里说一下,遇到动态规划应该如何去想,才能找到解决办法. 最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系. minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[