一、概念

1.1 简介

对于Java应用程序来说, Java堆(Java Heap) 是虚拟机所管理的内存中最大的一块。 Java堆是被所 有线程共享的一块内存区域, 在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例, Java 世界里“几乎”所有的对象实例都在这里分配内存。“几乎”是指从实现角度来看, 随着Java语 言的发展, 现在已经能看到些许迹象表明日后可能出现值类型的支持, 即使只考虑现在, 由于即时编译技术的进步, 尤其是逃逸分析技术的日渐强大, 栈上分配、 标量替换优化手段已经导致一些微妙的变化悄然发生, 所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和老年 代。

Untitled

1.2 特点

  1. 是Java虚拟机所管理的内存中最大的一块。

  2. 堆是jvm所有线程共享的。

    堆中也包含私有的线程缓冲区 Thread Local Allocation Buffer (TLAB)

  3. 在虚拟机启动的时候创建。

  4. 唯一目的就是存放对象实例,几乎所有的对象实例以及数组都要在这里分配内存。

  5. Java堆是垃圾收集器管理的主要区域。

  6. 因此很多时候java堆也被称为“GC堆”(Garbage Collected Heap)。从内存回收的角度来看,由于现在收集器,基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代;新生代又可以分为:Eden 空间、From Survivor空间、To Survivor空间。

  7. java堆是计算机物理存储上不连续的、逻辑上是连续的,也是大小可调节的(通过-Xms和-Xmx控制)。

  8. 方法结束后,堆中对象不会马上移出仅仅在垃圾回收的时候时候才移除。

  9. 如果在堆中没有内存完成实例的分配,并且堆也无法再扩展时,将会抛出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");
    }
}