Java堆(Java Heap)

虚拟机所管理的内存中最大的一块,在虚拟机启动时创建。此内存唯一的目的就是存放对象

几乎所有对象实例以及数组都应当在堆上分配。除了栈上分配、标量替换等情况。

堆的构成-回收内存角度

许多垃圾收集器都基于“经典分代”来设计的,需要将Java堆划分为新生代、老年代、永久代。

然后也需要新生代、老年代收集器搭配才能工作。

堆的构成-内存分配角度

堆是所有线程共享的,但也有线程私有的空间(Thread Local Allocation Buffer, TLAB)。

相关参数

作用
-Xmx -Xmx2g设置堆的最大可用内存
-Xms -Xms500m设置堆的初始内存
一般设置和-Xmx值相同,防止内存抖动

堆溢出代码

/**
 * 堆中存储Java对象,只需不断创建对象,并且保证GC Roots到对象之间有可达路径
 * 避免被回收即可产生内存溢出异常。
 *
 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
 */
public class HeadOOM {

    public static void main(String[] args) {

        List<HeadOOM> list = new ArrayList<>();
        while (true) {
            list.add(new HeadOOM());
        }
    }
}