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. How to DUMP the vba code protected by Unviewable+ VBA?

    原始出处:http://www.cnblogs.com/Charltsing/p/unviewable.html QQ: 564955427 Email: charltsing@gmail.com 有 ...

  2. Python 中关于 round 函数的坑

    round函数很简单(而且不需要引入math模块),对浮点数进行近似取值,保留几位小数. 比如 # -*- coding: UTF-8 -*- r1=round(12.12345,3) r2=roun ...

  3. Qt QComboBox下拉框文字重叠解决方法

    如果QComboBox下拉框文字重叠,在设置好样式之后,在后面加 setView(new QListView())即可; m_comboRate = new QComboBox(); m_comboR ...

  4. P4610 [COCI2011-2012#7] KAMPANJA

    题目背景 临近选举,总统要在城市1和城市2举行演讲.他乘汽车完成巡回演讲,从1出发,途中要经过城市2,最后必须回到城市1.特勤局对总统要经过的所有城市监控.为了使得费用最小,必须使得监控的城市最少.求 ...

  5. 数据分析---《Python for Data Analysis》学习笔记【01】

    <Python for Data Analysis>一书由Wes Mckinney所著,中文译名是<利用Python进行数据分析>.这里记录一下学习过程,其中有些方法和书中不同 ...

  6. Windows 7 下安装 docker 应用容器引擎

    文档地址 ====================================== 安装篇 下载工具 https://get.daocloud.io/toolbox/ 下载完成点击安装 (可参考: ...

  7. [HAOI2008]糖果传递 结论题

    题目描述 有\(n(n<1000000)\)个小朋友坐成一圈,每人有\(a_i\)个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为\(1\),求使所有人糖果数相等的最小代价. 暴力 ...

  8. host-only局域网络

    在网桥配置的情况下设置: 网桥配置链接 配置前: 配置后: vi /etc/sysconfig/network-scripts/ifcfg-eth0 这里是使用static静态配置,具体网络配置及声明 ...

  9. Go语言系列(八)- Goroute和Channel

    一.Goroute 1. 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配合调度的一个独立单位 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能 ...

  10. EF CodeFirst系列(1)---CodeFirst简单入门

    1.什么是CodeFirst 从EF4.1开始,EF可以支持CodeFirst开发模式,这种开发模式特别适用于领域驱动设计(Domain Driven Design,大名鼎鼎的DDD).在CodeFi ...