1、垃圾回收算法
   1.1、标记-清除算法(Mark-Sweep):
            过程分为“标记”和“清除”两个过程。先将所有需要回收的目标统一标记,然后再统一清除。
            不足:
                    1.“标记”和“清除”两个过程的效率并不高。
                    2.无法保证得到的内存是否是连续的。当存在大量的零碎的内存空间,但任一内存块均无法满足某个较大的对象存放时,还需要临时触发一次垃圾回收。
   1.2、复制算法(Yong区分为8:1:1的那种算法)
            这就是HotSpot中的方法:将内存区分为Eden区和两块Survivor(分别称为s0和s1)区。每次都将内存放在Eden区和s1,第一次回收之后,将还存活的对象放到s2中,保证s0和s1有一块是空的。每次均回收非空的Survivor区和Eden区,将存活的放入空余的Eden区中。配合分代使用,避免Survivor放不下存活的对象。
            缺点:在对象存活率较高时,要进行较多的对象复制,影响效率。
   1.3、标记-整理算法(Mark-Compact):Old区采用这种方法。
            标记:同上,将所有的需要回收的对象统一标记。
            整理:让存活的不需要被回收的对象,向一端移动,最后只要清除掉边界以外的对象(不需要回收的都移动到一端了)。
   1.4、分代收集算法
            将内存分为Yong区和Old区,然后根据不同区的特点分别对不同的区采用不同的收集算法。
2、HotSpot的算法实现
    HotSpot作为sun公司的主流虚拟机,在实现上述算法时,必定非常严谨。
    2.1、在判断对象是否存活时,采用“GC Roots”的遍历引用链,当可作为“GC Roots”的节点太多,从头到尾走遍引用链花费时间太长怎么办?
            确实,如果GC Roots太多,或者引用链太复杂时,从头到尾走遍引用链,会让程序停顿时间太长(gc线程运行时要停止所有线程以保证gc运行时不会产生多余的引用变化)。在虚拟机中多采用准确式GC,即在编译和类加载时,HotSpot就把对象内什么偏移量上是什么数据结构计算出来,并在JIT编译时在特定的位置记录下栈和寄存器中哪些位置是引用,然后将这些信息保存到一组称为OopMap的数据结构中。
   2.2、那么在什么位置生成OopMap,或者OopMap的生成条件,以防止过多的OopMap生成占用太多的内存空间。
            OopMap保存的是什么:在编译之后的指令中,如果某条指令或某段指令含有对象的引用,即在此生成OopMap,指明在某个寄存器和栈的具体偏移量的内存区域存在对象的引用/引用指针。
            所以,哪些位置需要生成OopMap,跟这些位置是否含有对象引用有关。需要生成OopMap的点成为“安全点”,即可以停下来执行GC的点。这些安全点的位置:不能太少,这样GC等待时间长。也不能过于频繁,会增加运行时的负荷(在运行时会在安全点调用是否执行gc的确认信息)。
   2.3、如何让程序在安全点进入GC?
            首先,为什么要让程序在安全点进入gc,是因为安全点保存了引用信息,程序在此位置进入GC,GC能轻松的扫描到引用信息,然后遍历引用链。
            那么如何保证进入GC时,所有的线程都在安全点上呢。方法一:抢先式中断(Preemptive Suspension),在GC发生时,首先把所有线程都中断,然后让没有在安全点的线程跑到安全点上去再停下来(现在几乎没有虚拟机采用这种)。方法二:主动式中断(Voluntary Suspension),当GC需要中断线程时,在安全点设置一个轮询标志(线程走到安全点即去询问),当轮询标志为真时,线程就停下来。进行GC。
   2.4、要是程序没有执行,线程不启动呢(例如sleep状态)?
         除了安全点(Safepoint),还有安全区(Safe Region)。所谓安全区,就是将安全点扩展为一个区域,在这个区域,引用关系不糊发生变化。进入安全区就告诉GC,如果要出安全区,需要得到GC 执行完毕的通知。
    

JVM·垃圾收集器与内存分配策略之垃圾回收算法!的更多相关文章

  1. 深入理解JVM - 垃圾收集器与内存分配策略 - 第三章

    引用计数算法——判断对象是否存活的算法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象 ...

  2. jvm垃圾收集器与内存分配策略

    一.垃圾回收 1.对象是否已经变为垃圾 1.1.引用计数法:给对象添加一个引用计数器,每当有地方引用它时,计数器就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 这 ...

  3. JVM垃圾收集器与内存分配策略(一)

    在前面的Java自动内存管理机制(上)和Java自动内存管理机制(下)中介绍了关于JVM的一些基础知识,包括运行时数据区域划分和一些简单的参数配置,而其中也谈到了GC,但是没有深入了解,所以这里开始简 ...

  4. jvm系列(二)jvm垃圾收集器与内存分配策略

    众所周知,在java语言中,内存分配和回收是由jvm自动管理的.因此内存的分配和回收也是jvm三大功能之一.垃圾收集器(GC)需要完成三件事情: 哪些内存需要回收? 什么时候进行回收? 如何回收? 本 ...

  5. JVM·垃圾收集器与内存分配策略之垃圾收集器!

    1.Serial(串行)收集器(新生代都采用复制算法)     这是个单线程的收集器:即 当他工作的时候,会停掉虚拟机所有的线程!(Stop The World)

  6. JVM·垃圾收集器与内存分配策略之对象是否可被回收!

    1.判断对象已经死去/不再被引用.     1.1.引用计数算法:给对象添加引用计数器,有个地方引用就+1,引用失效就-1.任何时刻,引用为0,即判断对象死亡.         1.1.1.优点:实现 ...

  7. java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...

  8. jvm系列 (二) ---垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...

  9. JVM性能优化系列-(2) 垃圾收集器与内存分配策略

    2. 垃圾收集器与内存分配策略 垃圾收集(Garbage Collection, GC)是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如 ...

随机推荐

  1. 让linux启动更快的方法

    导读 进行 Linux 内核与固件开发的时候,往往需要多次的重启,会浪费大把的时间. 在所有我拥有或使用过的电脑中,启动最快的那台是 20 世纪 80 年代的电脑.在你把手从电源键移到键盘上的时候,B ...

  2. (hdu 6024) Building Shops

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6024 Problem Description HDU’s n classrooms are on a ...

  3. Data Governance

    https://erwin.com/blog/data-preparation-mapping/

  4. Solving the Top ERP and CRM Metadata Challenges with erwin & Silwood

    Registrationhttps://register.gotowebinar.com/register/3486582555108619010 Solving the Top ERP and CR ...

  5. 关于dubbo+zookeeper微服务的一些认识记录

    借鉴架构示意图: 实例介绍: 公司某项目架构 服务器A:nginx 服务器BC:tomcat1.tomcat2 服务器D:Dubbo+zookeeper 服务器EF:db1+zookeeper.db2 ...

  6. PS中如何提高修改psd图片的效率(自动选择工具)

    在photoshop中制作图片的时候,一般要养成保留psd格式的习惯,纵然普通时候jpg,png格式常用,考虑到以后可能需要修改,也应该备份一下.如果考虑到以后需要修改,可每次成品保存成两个,一个ps ...

  7. JVM运行时内存组成分为一些线程私

    JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...

  8. Spring security oauth2 client_credentials认证 最简单示例代码

    基于spring-boot-2.0.0 1,在pom.xml中添加: <!-- security --> <!-- https://mvnrepository.com/artifac ...

  9. java 日期格式化

    DateFormat DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. SimpleDateFormat SimpleDateFormat 是一个以与 ...

  10. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...