java堆是虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,java世界里几乎所有的对象实例都在这里分配内存,所有的对象实例以及数组都应该在堆上分配。
java堆是垃圾收集器管理的内存区域,从回收内存的角度看,由于现代垃圾收集器大部分基于分代收集理论设计,新生代,老年代,永久代,eden空间,from survivor空间,to survivor空间
从内存分配的角度看,可以划分出多个线程私有的分配缓冲区TLAB,以提升对象分配时的效率。不过无论从什么角度,无论如何划分,都不会改变java堆中存储内容的共性,无论是哪个区域,存储的都只能是对象的实例。
java堆可以处于物理上不连续的内存空间中,但在逻辑上他应该是为连续的,这点就像我们用磁盘空间去存储文件一样,并不要求每个文件都连续存放。但对于大对象(典型的如数组对象),多数虚拟机实现处于实现简单、存储高效的考虑,很可能会要求连续的内存空间。
java堆即可以被实现成固定大小的,也可以是可扩展的,不过当前主流的java虚拟机都是按照可扩展来实现的(通过参数-xmx和xms设定)。