Java 堆

  对于大多数应用程勋来书,Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中描述是:所有的对象实例及数组都要在堆上分配,但是随着JIT编译器的发展和逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配在堆上也渐渐的变得不难么绝对了。

  Java堆是垃圾收集器管理的主要内存区域,因此很多时候也被称作“GC堆”。如果从内存回收的角度看,由于现在的收集器基本都采用的是分代收集算法,所以Java堆中还可以细分为:新生代和老年代;在细致一点的Eden空间,from survivor空间,to survivor空间。如果从内存分配的角度看,线程共享的Java堆中可能会出多个线程私有的分配缓冲区(Thread local allocation buffer)。不过无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例。进一步分化的目的是为了更好地回收垃圾,或者更快地分配内存。

  根据Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样,在实现时既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过—Xmx和-Xms控制的)。如果在堆中没有内存完成实例分配,并且对也无法再扩展时,将会抛出OutofmemoryError异常。

原文地址:https://www.cnblogs.com/yezixiao/p/7259483.html