如果你有过编程经验,知道把对象放在堆里是比较慢的,那么你自然就会认为Java把所有的东西都放在堆里的这种做法也一定是很慢的。但事实上垃圾回收器可以极大的提高创建对象的速度。第一次听到这种说法的时候,你可能会觉得有些奇怪——内存的释放怎么会对内存的分配有影响——但这就是JVM的工作方式,而且,Java在堆里分配内存的速度,可以同其他语言在栈里分配内存的速度相媲美。
举例来说,你可以把C++的堆理解成一个集装箱堆场,这里面的每个对象都要负责管理它自己那块地皮。过一段时间,这块地皮就会被空出来,并且重新投入使用。但是在一些JVM里面,Java的堆就有些不同了;它更像是一条每次分配新对象的时候会不断向前移动的传送带。因此,为对象分配内存会非常快。“堆指针”只是简单地向前面移动,所以实际上就同C++的栈的分配是一样的了。
现在,你可能也发现了,实际上堆不是一条传送带。如果真的这么做的话,就得非常频繁地启动虚拟内存的交换,进而耗尽系统资源。关键就是垃圾回收器。当它回收垃圾的时候,会把堆里面的对象全都压紧,实际上就是把“堆指针”往传送带的开头方向移,让它远离页面断层。垃圾回收器会重新安排内存,这样就实现了一种高速的,有无限的堆空间可供分配的内存分配模式。