堆
官方说法: “Java虚拟机具有在所有Java虚拟机线程中共享的堆。堆是所有类实例和数组的内存分配的运行时数据区。
该堆是在虚拟机启动时创建的。对象的堆存储由自动存储管理系统(称为垃圾收集器)回收 ; 对象从不显式释放。Java虚拟机假定没有特定类型的自动存储管理系统,并且存储管理技术可以根据实现者的系统要求来选择。堆可以是固定大小的,或者可以根据计算的需要进行扩展,并且如果不需要更大的堆,则堆可以被缩小。堆的内存不需要是连续的。
Java虚拟机实现可以提供程序用户控制堆的初始大小,以及如果堆可以动态扩展或收缩,则控制最大和最小堆大小。
以下异常情况与堆相关联:
如果计算需要比自动存储管理系统更多的堆,Java虚拟机会抛出一个 OutOfMemoryError。”
总结:
堆是在虚拟机启动时创建的
堆内存是所有线程共享的
- 堆内存中只存放着类实例(对象)和数组(特殊的对象)
- gc会对堆内存中的无用的对象进行回收,腾出内存以便新对象使用
- 堆内存可以固定大小、也可以设置成动态的。如果内存超出了设置的范围,则会抛出OutOfMemoryError