对于Java应用程序来说, Java堆(Java Heap) 是虚拟机所管理的内存中最大的一块。 Java堆是被所 有线程共享的一块内存区域, 在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例, Java 世界里“几乎”所有的对象实例都在这里分配内存。“几乎”是指从实现角度来看, 随着Java语 言的发展, 现在已经能看到些许迹象表明日后可能出现值类型的支持, 即使只考虑现在, 由于即时编译技术的进步, 尤其是逃逸分析技术的日渐强大, 栈上分配、 标量替换优化手段已经导致一些微妙的变化悄然发生, 所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。
Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和老年 代。
是Java虚拟机所管理的内存中最大的一块。
堆是jvm所有线程共享的。
堆中也包含私有的线程缓冲区 Thread Local Allocation Buffer (TLAB)
在虚拟机启动的时候创建。
唯一目的就是存放对象实例,几乎所有的对象实例以及数组都要在这里分配内存。
Java堆是垃圾收集器管理的主要区域。
因此很多时候java堆也被称为“GC堆”(Garbage Collected Heap)。从内存回收的角度来看,由于现在收集器,基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代;新生代又可以分为:Eden 空间、From Survivor空间、To Survivor空间。
java堆是计算机物理存储上不连续的、逻辑上是连续的,也是大小可调节的(通过-Xms和-Xmx控制)。
方法结束后,堆中对象不会马上移出仅仅在垃圾回收的时候时候才移除。
如果在堆中没有内存完成实例的分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
Xmx20m -Xms5m -XX:+PrintGCDetails
测试:
package com.study.jvm.heap;
public class HeapDemo {
public static void main(String[] args) {
byte[] bytes = new byte[1024 * 1024 * 13];
System.out.println("MaxMemory:" + Runtime.getRuntime().maxMemory() / 1024 /1024 + "m");
System.out.println("FreeMemory:" + Runtime.getRuntime().freeMemory() / 1024 /1024 + "m");
System.out.println("TotalMemory:" + Runtime.getRuntime().totalMemory() / 1024 /1024 + "m");
}
}