作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题
代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等
回答
指针碰撞
指针碰撞是一种内存分配技术。我们知道绝大多数 Java 对象是在 Java 堆中分配(发生逃逸分析除外),我们假定 Java 堆中的内存是绝对规整的,已分配内存和未分配内存是互相隔开的,中间由一个指针作为分界点,即该指针的左边全部都是已被使用的内存,右边是空闲的内存。当需要分配内存时,JVM 只需要将指针向前(右)移动(也可称之为“碰撞”)相应的大小,然后将内存块分配给对象。如下:

指针碰撞的优点就在于它分配内存效率高,因为它只需要简单地移动下指针就可以了,同时,也没有内存碎片问题,因为它每次分配内存都是连续的。缺点就在于它需要堆内存绝对规整,适合复制算法。所以指针碰撞通常用于新生代的垃圾收集器中。
空闲列表
与指针碰撞不一样,空闲列表不需要连续的内存空间。它维护一个指针,列表中的每一个元素都指向内存中空闲的内存块。每当需要分配内存时,JVM 会通过这个列表找到一块足够大的内存块,然后将它分配出去。当然,如果块过大,则会被拆分为两个部分,一个分配给对象,另一个继续留在空闲列表中。

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

被折叠的 条评论
为什么被折叠?



