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. 《Effective C++》定制new和delete:条款49-条款52

    条款49:了解new-handler的行为 当operator new无法分配出内存会抛出异常std::bad_alloc 抛出异常前会反复调用用户自定义的new-handler函数直至成功分配内存 ...

  2. 最简单的 springboot 发送邮件,使用thymeleaf模板

    1,导入需要的包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  3. CCProxy使用说明

    CCProxy:通过手机调试webservice工具 第一步配置,点击设置 弹出如下页面点击E 弹出如下页面 配置端口,点击确定配置完成!! c#项目在路径为DCYS\.vs\config下找到文件a ...

  4. 金融量化之Tushare模块

    一.介绍 Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程,能够为金融分析人员提供快速.整洁.和多样的便于分析的数据,为他们 ...

  5. 在本机使用虚拟机安装一个linux系统,并搭建ftp服务器

    一.Linux基础使用:linux服务器环境搭建(FTP服务器), 在本机使用虚拟机安装一个linux系统,并搭建ftp服务器,要求能使用ftp服务将本机文件到保存linux虚拟机上 资料: VMwa ...

  6. 一分钟学会JavaMail(假)__手动滑稽

    因为公司内部办公系统(OA)需要增加一个发送邮件的功能,所以学习了这个感觉比较冷门的JavaMail   1.先上成功截图 : 2.准备事项:Java Mail虽然是官方写的,但是没有集成到jdk里面 ...

  7. Windows Linux的cmd命令查询指定端口占用的进程并关闭

    以端口8080为例: Windows  1.查找对应的端口占用的进程:netstat  -aon|findstr  "8080",找到占用8080端口对应的程序的PID号: 2.根 ...

  8. 【XSY2925】cti 网络流

    题目描述 有一个 \(n\times m\)的网格,每个格子里面可能有一些炮塔,或者有几个人. 每个炮塔可以在给定的方向(上下左右)上选一个点作为它的攻击位置,然后消灭这个格子里面的所有人.当然也可以 ...

  9. python学习日记(OOP——@property)

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

  10. pthread_cond_wait学习笔记

    pthread_cond_wait学习笔记 近期学习了线程等待和激活的相关知识. 先介绍几个api: pthread_cond_t表示多线程的条件变量,用于控制线程等待和就绪的条件. 一:条件变量的初 ...