最近研究了下jvm调优,下面说说我对垃圾搜集算法的一些自己的理解
jessonlv-吕国栋原创文章,转载请注明出处:http://blog.csdn.net/jessonlv/article/details/19494931
垃圾搜集算法从发展历程来看,可以大致分为三种搜集算法,最基础的搜集算法是“标记-清除算法”,另外一个是后来出现的为解决“标记-清除算法”效率问题的“复制”算法,到最后发展到现在的以分代式的回收方式,对内存中的对象按照它们的生命周期划分为几代,然后再对其进行搜集回收内存。
1、标记-清除算法(mark-sweep)
就像其名字一样,这种算法先是把所有需要回收的对象进行标记,然后再一次性清除这些标记的对象,也就是分为两步1、标记,2清除。之所以前面说这是一种最基础的算法,是因为目前为止,其他的垃圾搜集算法都是以此种算法为基础,然后对此算法进行了改进,优化了这种算法的缺点,说到缺点,这种算法有两种缺点1、效率问题,对所有对象一一进行标记然后再一一进行清除,这是最原始的操作。2、连续空间问题,一一的标记和清除后,会导致大量的非连续内存空间碎片,进而导致分配不到所需要的足够长度的内存空间,这又会引发另外一次的垃圾搜集机制。
2、复制算法(coping)
这种算法在一定程度上解决了标记-清除算法效率和连续内存空间的问题,它的做法就是将内存分为两块,每次只使用其中的一块,当这块使用完的时候,其就将这块内存中还存活的对象复制到另一半的内存中去,然后将剩下已死对象的那半块全部清除,这样就不用考虑连续的问题,而且提高了效率,但是它的代价是牺牲一半的内存,这代价也太大了,对吧!!
3、分代式的垃圾搜集方式
按照对象的生命周期,将其分为年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)
IBM有专门的研究表明,大部分的新生的对象,98%都是朝生夕死的,所以在年轻代中,我们不必为内存都进行1:1比例的分配,而是将其分为一块较大的eden(中文意思是伊甸园,是不是新生内存能像在伊甸园里一样自由自在的生存的意思?笔者意淫,请勿当真啊)区和两个较小的survivor空间,每次使用的时候只是用eden和一个survivor,当需要进行垃圾搜集的时候,把这两块里面存活的对象复制到这块空的survivor中,然后就清除eden和survivor,这样做的好处是解决了基础方法的效率和空间的问题,又解决了牺牲太多内存空间的问题。Sun
Hotspot虚拟机默认eden和survivor的大小比例是8:1,也就是每次只有10%的内存是“浪费”的。但是也有例外的情况,我们不能保证每次都是98%的对象死掉了,如果要是超过10%存活下来,那就要靠年老代等对其进行担保了。
年老代
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代
持久代主要是存放静态文件、方法等,持久代对垃圾搜集没有显著影响,但是有些类可能要动态生成,这个时候就需要对持久代进行较大的设置
以上拙见,个人理解如有偏差,欢迎大家提出批评意见。
分享到:
相关推荐
设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。
全都是自己写的,都能跑出来 实打实写的哦~ 仅供参考 最重要的还是自己理解 1.学习并掌握回溯法 2.利用迭代回溯和递归回溯两种方法解决01背包问题。 预览地址:
算法源码-分类与判别:K-近邻法分类代码.zip
基于K-means算法的光伏曲线聚类研究 关键词:k-means 光伏聚类 聚类 参考文档:《基于改进 K-means 聚类的风光发电场景划分》仅部分参考 仿真平台:MATLAB平台 主要内容:代码主要做的是一个光伏曲线聚类的模型,...
一种全局优化算法:遗传算法-单纯形法 解决TSp问题
在matlab下实现两个经典的多目标优化算法:NSGA-II和MOEA/D。NSGA-II是基于非可支配性排序的一种算法,而MOEA/D为基于分解的一种多目标优化算法,两种都属于基于进化的多目标优化算法(MOEA)。
四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old、G1 JVM调优:命令行指令,设置堆内存大小的参数
深入理解JVM垃圾收集算法与垃圾收集器
资源来自网络,经过我的配置,可完整运行,实现DPM算法对行人的检测,是一个一个完整的实现,含有注释和完整的工程文件,环境为win7+vs2013+matlab2016b,其他版本MATLAB也可
1.公钥密码算法需要素数,任何合理规模的网络也需要许多这样的素数,了解如何对产生的随机数进行素性检测的方法。 2.掌握和理解Solovag-Strassen算法、Lehmann算法和Rabin-Miller素性检测算法的原理。
在网上看到了很关于10大算法的一些博客讲解,大多都支离破碎讲解的部分,而且不同的博客讲解的方式很多不同,我希望能重新整理这些基础算法,尽量更全面和深入一些,分享出来,共大家参考。 k-means 【3】算法,也...
算法精解:C语言(中文版)_带书签,讲述C语言常用算法,学习用
毕业设计:基于深度网络的垃圾识别与分类算法研究 毕业设计:基于深度网络的垃圾识别与分类算法研究 毕业设计:基于深度网络的垃圾识别与分类算法研究 毕业设计:基于深度网络的垃圾识别与分类算法研究 毕业设计:...
回溯算法解0--1背包问题
本实验要求学生独立设计并实现磁盘调度模拟程序,以加深对磁盘调度特点和各种磁盘调度算法的理解。 实验要求: 可以随机输入磁道请求序列,当前磁头位置和磁头移动方向,支持先来先服务、最短寻道时间优先、扫描...
该资源通过图像及文字详细分析回答了JVM垃圾...图画详细介绍常见的三种垃圾回收算法,包括标记-清除算法、标记-整理算法和标记-复制算法。 3.垃圾回收的具体流程是怎样的? 图画分析介绍垃圾回收机制额分区和算法过程
基于Vision Transformer的图像去雾算法研究与实现python源码+项目介绍使用说明.zip 如果要继续对模型进行训练:--pretrain_weights 设置预训练权重路径,我的模型预训练权重在My_best_model文件夹下,以数据集划分...
算法篇介绍了标记-清除算法、引用计数法、复制算法、标记-压缩算法、保守式GC、分代垃圾回收、增量式垃圾回收、RC Immix算法等几种重要的算法;实现篇介绍了垃圾回收在Python、DalvikVM、Rubinius、V8等几种语言处理...
1.理解掌握K-means聚类算法的基本原理; 2.学会用python实现K-means算法 K-Means算法是典型的基于距离的聚类算法,其中k代表类簇个数,means代表类簇内数据对象的均值(这种均值是一种对类簇中心的描述),因此,K...