笔记--JVM中的堆和栈,GC

栈内存

  • 栈是方法执行的内存模型,每一个方法的调用都会在栈中创建一个栈帧,用来存放方法内的局部变量(定义在方法内部的变量)、实际参数等。
  • 在程序运行时,往往会启动多个线程,JVM(虚拟机)会给每一个线程单独分配或者说创建一个栈内存,用来存放当前线程执行的方法中的局部变量和实际参数。
  • 栈属于每个线程私有的,不能共享。
  • 栈存储的规则是先进后出,后进先出原则。 由于局部变量的生命周期很短,所以栈内存的更新速度很快。
  • 栈是一片连续的内存区域。

堆内存

  • 堆内存在JVM中只存在一个,且被所有线程共享。
  • 堆是一个不连续的内存空间,分配灵活,但是速度慢。
  • 所有的对象都存储在堆内存中。
  • 堆内存中有一块特殊的区域我们称为方法区,方法区中用来存储类信息、静态变量和字符串常量。

GC(垃圾回收机制)

  • GC是 jvm的内存管理机制,核心有两点:
    1、发现jvm中的无用对象,即确定要被回收的对象。
    2、将此无用对象占用的内存空间进行回收。
  • 相关算法:
    1、引用计数法
    每个对象头中都会存在一个引用计数器(counter),当此对象被变量引用一次,则计数器 + 1,当被引用变量置为null,则计数器 -1 ,当counter变为0时,即代表没有任何变量引用了该对象,此时GC将回收此对象的内存空间。此算法有一个弊端,当两个对象之间相互引用,则这两个对象中的counter将永远无法置为0,形成循环引用的无用对象
    2、可达性分析法:
    程序将所有的对象引用关系看做一个由很多节点链接成的图,从一个GC ROOT节点开始,找到root节点的相关引用节点(假设为b),找到b节点后,再去寻找与b节点引用相关的节点,以此类推,当找到所有的引用节点后,剩余没有被引用的对象节点将会被回收。可达性分析算法

分代垃圾回收

  • 对象在内存中可以分为三类:年轻代,年老代,持久代(垃圾回收不针对持久代)。
  • JVM将堆内存分为三个空间:
    Eden:(存储从未被回收过的新对象)
    Survivor:(存储垃圾回收后,仍然有用的对象,并且对象小于15次垃圾回收次数。分为 Survivor1 区和 Survivor2 区。)
    Old:(存储大于15次垃圾回收次数的对象)。
  • 三种GC:

Minor GC:用于清理年轻代区域,当Eden区满了之后会触发一次Minor GC,将Eden区清空,将有用的对象通过复制算法存储到Survivor区。

Major GC:用于清理年老代区域。

Full GC:清理年老代和年轻代区域,成本较高,会对系统性能产生影响,垃圾回收的优化大部分也是针对Full GC的。

分代垃圾回收过程:

1、创建新对象,存储在Eden区
2、当Eden区满了或者达到一定比例,触发Minor GC,清空Eden区。
3、当Eden区再次满了,重复上一步,并将Survivor1区中有用的对象复制到Survivor2区中,同时清空Survivor1区。
4、经历多次GC(默认15次)后还在Survivor区中未被清除的对象,会被放在Old区中。
5、当Old区满了,会触发一次完整的Full GC。

注:System.gc()调用,只是程序触发一个垃圾回收的请求,或者说建议,但具体是否执行垃圾回收,不是由程序控制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值