读码农翻身之Java虚拟机的堆

回顾一下java内存区域划分:
在这里插入图片描述
1、Heap中主要保存对象
2、垃圾回收:java程序员只需要将对象给new出来,扔到heap中,但是从来不把它delete掉,所以需要有垃圾回收机制来删掉这些对象。而这其中也涉及到一些算法

如 可达性分析算法:橙色的对象都是不可达对象,可以回收
在这里插入图片描述

3、Heap的详解
可以把Heap想象成一大片空间,为了方便管理,把heap划分为多个区域,然后把那些java对象在其中搬来搬去。
在这里插入图片描述
规定:新创建出来的对象,是保存在新生代中的,如果新生代住不下了,就进行垃圾回收(Minor GC),回收以后还住不下,那就把一些寿命比较就的对象转移到老年代中去。如何区分对象的寿命呢?在heap中的对象都会设置一个年龄计数器,每次java对象经历过一次GC,那么就将年龄加1.

为什么要在新生代分出Eden、Survivor1、Survivor2这样的区域呢?(Eden意思是伊甸园,在圣经中应该是象征着无忧无虑的好地方)
这是因为想要实现一个复制算法:
在这里插入图片描述
分为两个区域,每次只用其中的一个。当区域1用完了,就做垃圾回收,把存活的都搬到另外一个区域。这种来回颠倒使用两个区域,虽然效率高,没有碎片,但是浪费的空间很巨大,每次只能用一半!后来发现了规律,大部分在新生代的对象都活不了多长时间,基本上一次垃圾回收就删除得差不多了。所以对这个算法进行了改进,将新生代分为了三个部分:Eden、Survivor1、Survivor2,他们的比例是8:1:1
每次只使用Eden和其中一个Survivor,当垃圾回收时,把这两块区域中还活着的对象复制到另外一个Survivor,如果Survivor放不下,就放入老年代。如果老年代也满了, 那么就能做一次Full GC!

4、Off-Heap—堆外内存
在这里插入图片描述
复制数据太麻烦了,可以在java代码中直接分配一块属于off-heap的内存。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值