目录
一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域
Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间
堆内存的大小是可调节的
《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的
所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)
几乎所有对象实例以及数组都应当运行时分配在堆上
数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置
在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除
堆,是 GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域
Java 堆区用于存储 Java 对象实例,那么堆的大小在 JVM 启动时就已经设定好了,大家可以通过选项 “-Xmx” 和 “-Xms” 来进行设置
“-Xmx” 用于表示堆区的最大内存,等价于 -Xx:MaxHeapSize
“-Xms” 用于表示堆区的起始内存,等价于 -Xx:InitialHeapSize
一旦堆区的内存大小超过 “-Xmx” 所指定的最大内存时,将会抛出 OutOfMemoryError 异常
通常会将 -Xms 和 -Xmx 两个参数配置相同的值,其目的是为了能够在 Java 垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小,从而提高性能
默认情况下
初始内存大小:物理电脑内存大小 / 64
最大内存大小:物理电脑内存大小 / 4
方式一:cmd下,jps / jstat -gc 进程 id
方式二:-XX:+Print'GCD'e'tails