jvm分配空间有两种方式,以下采用通俗的方式来阐述:
假如小兔子每次买胡萝卜种子以后都会在一块地里种下种子(这块地是固定的),假设每粒种子所需要的土地是一样的,那么小兔子有两种种法:
第一种:小兔子每次都买十个种子,买完以后依次种这块地上
第二种:小兔子随机买种子,每次买的种子数都不一样,种的时候也随便找到一块能种的土地就种下
——————————————————————————————————————————
以上第一种方式就是jvm分配内存所对应的两种方式,
第一种是指针碰撞,这种方式是在内存绝对规整时所采用的方式, 指定一个指针,左边是用过的,右边是空的,严格要求空间一定是规整的(右边的空间一定都是空的)。
第二种是空闲列表,这种方式是在内存并不规整时所采用的方式,每次选一个足够大的空间划分给对象实例。
选择哪种分配方式由
Java
堆是否规整决定,而
Java
堆是否规整又由所采用 的垃圾收集器是否带有空间压缩整理
的能力决定。因此,当使用
Serial
、
ParNew
等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞,既简单又高效;而当使用CMS
这种基于清除 算法的收集器时,理论上
就只能采用较为复杂的空闲列表来分配内存。