Java垃圾回收机制

学习笔记,大佬勿喷!

1. JVM对数据的划分

  • 栈区: 存放一些基本类型的变量、对象的引用变量,当变量超出其作用域后,Java会自动释放掉为该变量分配的内存空间。栈的优点是存取速度比堆要快,但存在栈中的数据大小与生存期必须是确定的,另外,栈数据可以共享。
  • 堆区: 用来存放有new创建的对象与数组,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。堆区是GC主要管理的区域,其可以细分为新生代区域(1个eden,2个survivor)和老年代区域。
  • 堆与栈共享性的区别:
    string a=“gy”, string b=“gy”, 此时a,b指向同一个栈内存;(栈内存的共享)
    string a=new string(“gy”), string b=new string(“gy”),此时a,b指向不同的堆内存。

2. GC的工作流程(何时回收?)

  • 新生代区域的操作: 绝大多数最新被创建的对象都会被分配到这里,对象从这个区域“消失”的过程我们称之为:Minor GC 。
  • 老年代区域的操作: 对象从新生代周期中存活了下来,会被拷贝到这里,对象从老年代中“消失”的过程,称之为Major GC或者Full GC。
  • 工作流程: eden区空间不够存放新对象的时候,执行Minro GC。升到老年代的对象大于老年代剩余空间的时候执行Full GC。调优主要是减少Full GC的触发次数。

3. 哪些内存需要回收(回收什么?)

  • 引用计数法: 为堆中的每个对象都维持一个引用计数器,当计数器为0时就将此对象判别为垃圾。
  • 根搜索算法: 将某一个引用对象看做是根结点(GC Root),并以此遍历引用树,对各个可以作为GC Root的结点全部遍历之后,剩余结点即为垃圾对象。
    在这里插入图片描述
    在Java中采用根搜索法寻找垃圾对象。

4. 回收算法(怎样回收?)

  • 标记-清除算法: 从根集合进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象进行直接回收。
  • 标记-整理算法: 采用标记-清除算法一样的方式进行对象的标记、清除,但在回收不存活的对象占用的空间后,会将所有存活的对象往左端空闲空间移动,并更新对应的指针,解决了内存碎片的问题。
  • 复制算法: 将内存划分为两个区间(活动区、空闲区),从根集合扫描,将存活的对象复制到空闲区间,当扫描完毕活动区间后,会的将活动区间一次性全部回收。此时原本的空闲区间变成了活动区间,下次GC时候又会重复刚才的操作,以此循环。

JVM为了优化内存的回收,使用了分代回收的方式,对于新生代内存的回收(Minor GC)主要采用复制算法。而对于老年代的回收(Major GC),大多采用标记-整理算法。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值