理解jvm的垃圾回收策略,需要解决以下3个问题
问题1:哪些内存需要回收?
问题2:什么时候进行回收?
问题3:怎样来回收?

【解决问题1】哪些内存需要回收?
jvm的内存区域有5大块:
1)程序计数器:线程私有,用于记录 当前线程所执行class 字节码的行号计数器;
2)java 虚拟机栈:线程私有,指java 方法执行的 内存模型;
3)本地方法栈:线程私有,指java 本地方法执行的 内存模型;
4)java堆:线程公有,用于存储所有对象实例 和 数组;
5)方法区:线程公有,用于存储编译后的 类信息(Class类),常量,静态变量 和 即时编译后的数据;
显然,线程公有的内存区域需要回收,即 java堆 和 方法区;
看个荔枝:以可达性分析算法为荔枝,来介绍哪些内存需要回收?
其基本思想就是通过称为“GC Root”的对象作为起点,点向下搜索,搜索所走过的路径称为引用链,但一个对象到GC Root没有任何引用链相连的话,则证明对象是不可用的;(这时可以考虑通过 相交集和非相交集算法来实现)
GC Roots的对象包括下面几种(Objects):
O1)虚拟机栈或本地方法栈中引用的对象;
O2)方法区中常量或类静态属性引用的对象;

【解决问题2】什么时候进行回收?
显然当 java堆或方法区的内存容量不足以满足class字节码运行时所需要的内存空间的时候,就需要进行内存回收(因为在运行期间,你不知道该字节码文件需要多少内存,多大内存);

【解决问题3】怎样来回收?这就不得不讲 垃圾回收算法了。
写在前面)java堆分为 老年代 和 新生代;对象首先分配在新生代Eden区中,当在新生代中经过若干次垃圾收集后,该对象如果还存在的话,就将其移入老年代进行存储;

算法1)标记-清除算法(回收老年代):首先根据可达性分析标记处需要回收的对象;之后再统一回收所有被标记的对象;
缺点1:效率问题,标记和清除两个效率都不高;
缺点2:空间问题,标记清除之后会留下大量的内存碎片 以至于可能导致以后分配较大对象时,因为无法找到足够的连续内存而不得不提前触发来一次垃圾收集动作;

算法2)复制算法(回收新生代):将jvm公共内存(主要是堆内存)划分为容量相等的两块A 和 B,每次只使用其中一块,如A 来进行运行时的内存分配;当块A要使用完的时候,将块A中的还存活的对象复制到 块B上,然后一次性回收块A中的使用空间。下一次就使用块B 来进行运行时的内存分配了,而块A的使用空间为零,即块A的所有空间可用(复制垃圾回收算法主要解决的问题是: 内存碎片问题)。
缺点1:该算法的代价是将内存缩小了一半;内存利用率低;


算法3)复制算法变体算法(回收新生代):内存空间并不是像 算法2那样 1:1 的分配,而是将内存分为 一块 8个单位的称为 Eden空间的内存, 两块 1个单位的称为Survivor 空间的内存,记为A和B;每次只使用 Eden空间内存 和 其中一块Survivor空间 如A的内存;当 上述内存空间要使用完的时候,就把 Eden空间和 Survivor A 空间的对象复制到 Survivor B空间中,然后再清除 Eden空间 和 Survivor A 空间中的内存;下次运行时内存分配区域是 Eden空间 和 Survivor A空间;
那如果 上述过程中 Survivor B 无法储存 Eden 和 Survivor A 中的对象的时候,需要其他内存(老年代)进行分配担保,即借用老年代的一部分内存空间来存储 Eden 和 SurvivorA 中的对象数据。

算法4)标记整理算法(回收老年代):该算法类似于 标记清除算法,不同的是在清理阶段,让所有存活对象都向一端移动,然后直接清理内存边界以外的内存

算法5)算法综述——分代收集算法:要知道 java堆内存分为 新生代 和 老年代;
新生代:新生代中,每次垃圾收集时都发现有大批对象时区,只有少量存活,选用复制算法;
老年代:因为老年代中 对象存活率高,没有额外空间对它进行分配担保,就必须使用 “标记-清理” 或 标记整理算法 进行回收;
【2】Minor GC 和 Full/Major GC
1)Minor GC(新生代GC):因为 对象首先分配在 java堆新生代中的 Eden空间,如果Eden空间不够用的话,就会进行一次 Minor GC;
2)Full/Major GC(老年代GC):大对象直接进入老年代(大对象就是需要大量连续内存空间的对象)
注意)Full/Major GC 比 Minor GC的速度至少慢10倍以上;所以能用Minor GC 解决问题 就不要用 Major GC;

ReviewForJob——java虚拟机的垃圾回收策略(个人总结)相关推荐

  1. java虚拟机多久触发垃圾回收_每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  2. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  3. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  4. 浅析Java虚拟机的垃圾回收机制(GC)

    目录 一.垃圾回收机制(Garbage Collection) 二.对象回收的时机 引用计数法 可达性分析算法 三.垃圾回收算法 标记-清除算法 标记-复制算法 标记-整理算法 新生代.老年代.永久代 ...

  5. Java虚拟机:垃圾回收机制与垃圾收集器

    一.垃圾回收机制: 1.垃圾回收的过程: JVM内存区域的程序计算器,虚拟机栈.本地方法栈的生命周期是和线程同步的,随着线程的销毁而自动释放内存,所以只有堆和方法区需要GC,方法区主要是针对常量池的回 ...

  6. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)

    java与C++之间有一道动态内存分配和垃圾收集的"墙",墙里面的人想出来,墙外边的人想进去,或许只有骑在墙上才能清楚的了解,墙内墙外都是牢笼. 上面一句出自<深入理解jav ...

  7. 深入理解Java虚拟机——JVM垃圾回收机制和垃圾收集器详解

    一:概述 说起垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,顾名思义,垃圾回收就是释 ...

  8. java虚拟机、垃圾回收、多线程

    虚拟机,我们都知道Java程序运行在虚拟机上,虚拟机又和操作系统打交道,最终通过二进制指令操纵电子电路运行.完成数据的读取,存储,运算和输出. 虚拟机在加载.class文件的时候,会在内存开辟一块区域 ...

  9. Java虚拟机之垃圾回收

    1. 判断对象可以被回收 1.1 引用计数法 给对象添加一个引用计数器,每当用一个地方引用它时,计数器加一:当引用失效时,计数器减一,计数器为0的对象就是不可能再被使用的. 存在的弊端:循环引用,如下 ...

最新文章

  1. R语言PCA主成分分析(Principle Component Analysis)实战1
  2. Linux centos 下apache(httpd)编译安装
  3. Linux 内核将要支持最新龙芯 3A2000/3B2000
  4. 面试必问!有没有比读写锁更快的锁?
  5. 如何实现分类表统计数目和详情表数量同步
  6. 实验三 进程调度模拟程序2.0
  7. 【测试点分析】1060 爱丁顿数 (25分)_21行代码
  8. Ubuntu主题更换
  9. 那些年面挂的js手写题
  10. 爬FH... ... 爽!
  11. 腾讯云十亿级 Node.js 网关的架构设计与工程实践
  12. 比较精确的计算农历节气的java源码
  13. Python自动化--1.Python环境安装-linux
  14. Rabbit MQ的基本使用
  15. 计算机教师培训感悟反思,教学工作反思感悟
  16. (21) 出行需求预测新视角---基于图卷积神经网络GCN的出租车OD需求预测
  17. QQ用户这两个文件夹要定时清理
  18. Spring Bean作用域与生命周期
  19. 计算机辅助设计ca,《AutoCA计算机辅助设计》课程标准.doc
  20. java wgs84转西安80_如何将西安80坐标转换为国家2000(或WGS84)坐标系?

热门文章

  1. HDU - 6967 G I love data structure 线段树维护矩阵 + 细节
  2. 【SHOI2017】相逢是问候【扩展欧拉定理】【复杂度分析】【线段树】
  3. 欧拉函数(简单介绍+例题)
  4. [ZJOI2015]幻想乡 Wi-Fi 搭建计划(dp + 结论)
  5. 对弈(nim-k游戏博弈)
  6. Codeforces Round #725 (Div. 3) 题解
  7. nssl1217-So many prefix?【KMP】
  8. Graph Theory Class(Min25求1~n质数和)
  9. 牛客练习赛 58——树链剖分
  10. 从零开始用好 Maven : 从 Hello World 到日常使用