说起GC,我们要思考的主要有三件事

哪些内存需要回收

那些已经“死去”的对象,那么哪些对象“死”,哪些对象“活”呢,有个简单的办法

引用计数法,但是没法解决循环依赖问题

所以Java虚拟机采用的是可达性分析算法

这个算法通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,如果对象无法被搜到,那么这些对象会被标记为要清除的对象。

那么“GC Roots”又是什么?“GC Roots”主要有以下几种

活跃栈帧中的指向GC堆的引用,就是方法运行时的临时变量,引用参数

被加载的Java类

Java类中的引用类型静态变量

等等

什么时候回收

谈什么时候回收还得从minor gc和major gc(full gc)讲起,minor gc指新生代回收,major gc指老年代回收

先来讲新生代回收的原因,新生代内存区域分为eden区和两个survivor区(hotspot默认为eden:survivor=8:1)当eden要满了了,就进行一次minor gc

再来讲讲老年代回收的原因,新生代升到老年代的区域满了,就会发生major gc

那么如果gc后还是满了呢?那就OutOfMemoryError

如何回收

对于新生代和老年代有不同的回收策略

新生代:新生代对象来的快去的也快,所以采用“标记复制算法”,eden区存活内容复制到survivor1区,然后清空eden区,然后当survivor1区要清理就升入survivor2区,最后升入老年代

老年代:老年代对象存活时间长,所以采用“标记清除算法”。

最新文章

  1. Kali Linux渗透测试实战 1.2 环境安装及初始化
  2. zepto笔记 001
  3. ClassLoad的加载过程及分析
  4. Map的简单语法
  5. Mysql主从库同步错误:1062 Error 'Duplicate entry '1438019'
  6. 转!!为什么要java环境变量配置?
  7. TortoiseHg简单的入门使用说明
  8. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
  9. less.css基础学习,陆续更新中
  10. 用U盘与移动硬盘制作WIN7启动盘(亲自实践)
  11. Challenges-XSS
  12. 怎么写自己的CMakeLists.txt
  13. JavaScript系统对象
  14. C# DataGrid 用法---极速入门测试
  15. A1051. Pop Sequence
  16. 如何批量的在django中对url进行用户登陆限制
  17. 01: Python基本数据类型
  18. Python3基础 time 索引值访问元组中的年月日时分秒
  19. MVC ---- 标准查询运算符
  20. m_Orchestrate learning system---三十二、数据库字段判断为空时容易出现问题,如何从根本上解决这个问题

热门文章

  1. 创建java类并实例化类对象
  2. 使用miniconda创建python虚拟环境
  3. Netty学习记录
  4. Linux内核分析第六次作业
  5. 1.4 安装Linux系统
  6. DataTable的详细用法
  7. MySQL:System.Data.Entity ,MySqlCommand, MySqlParameter and "LIKE" %
  8. Ubuntu 12.04图形界面不能登录问题
  9. Redis和Memcache区别,优缺点对比
  10. 虚拟机网络连接NAT模式,本地用Xshell连接