什么是指针碰撞?什么是空闲列表?

 作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题


代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等


联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等

回答

指针碰撞

指针碰撞是一种内存分配技术。我们知道绝大多数 Java 对象是在 Java 堆中分配(发生逃逸分析除外),我们假定 Java 堆中的内存是绝对规整的,已分配内存和未分配内存是互相隔开的,中间由一个指针作为分界点,即该指针的左边全部都是已被使用的内存,右边是空闲的内存。当需要分配内存时,JVM 只需要将指针向前(右)移动(也可称之为“碰撞”)相应的大小,然后将内存块分配给对象。如下:

指针碰撞的优点就在于它分配内存效率高,因为它只需要简单地移动下指针就可以了,同时,也没有内存碎片问题,因为它每次分配内存都是连续的。缺点就在于它需要堆内存绝对规整,适合复制算法。所以指针碰撞通常用于新生代的垃圾收集器中。

空闲列表

与指针碰撞不一样,空闲列表不需要连续的内存空间。它维护一个指针,列表中的每一个元素都指向内存中空闲的内存块。每当需要分配内存时,JVM 会通过这个列表找到一块足够大的内存块,然后将它分配出去。当然,如果块过大,则会被拆分为两个部分,一个分配给对象,另一个继续留在空闲列表中。

相比指针碰撞,空闲列表的优势在于它更加灵活,能有效地处理非连续内存空间,同时,也更加适合碎片化内存的管理。但是它的缺点在于它可能会产生内存碎片。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值