扫码关注微信公众号

回复“面试手册”,获取本站PDF版

回复“简历”,获取高质量简历模板

回复“加群”,加入程序员交流群

回复“电子书”,获取程序员类电子书

当前位置: Java > JVM高频面试题 > 4.创建对象时内存是如何分配的

上文提到,创建对象的内存分配方式会根据Java内存是否完整分为指针碰撞(完整)空闲列表(不完整)两种:

  • 指针碰撞:假设为Java堆中内存是绝对完整的,所有用过的内存放到一边,空闲的内存放到另一边,中间放着一个指针作为分界点的指示器,所分配的内存就是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为指针碰撞。
  • 空闲列表:假设Java堆中的内存并不是完整的,已使用的内存和空闲内存都混在一起了,这时虚拟机需要维护一个列表,用来记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为空闲列表。

注:选择哪种分配方式由Java堆是否完整决定,Java堆是否完整由所采用的垃圾收集器是否带有压缩整理功能决定。因此,在使用Serial、ParNew等垃圾收集器时系统采用的是指针碰撞,在使用CMS等基于标记擦除算法的收集器时,采用的是空闲列表。


点击面试手册,获取本站面试手册PDF完整版