JAVA堆(Heap)

定义:JAVA堆是被所有线程共享的内存区域,在虚拟机启动时创建,是虚拟机管理的内存中最大的一块空间

堆中对象存储的是该对象以及对象所有超类的实例数据(但不是静态数据);

一个对象的引用可能在整个运行时数据区中的很多地方存在,比如Java栈,堆,方法区等;

堆中对象还应该关联一个对象的锁数据信息以及线程的等待集合(线程等待池);这些都是实现Java线程同步机制的基础

JAVA虚拟机规范描述

所有的对象实例以及数组都要在堆上分配

特性

  • 线程共享
  • 内存最大的一块
  • 目的:存放对象实例和数组,但随着JIT的发展和逃逸分析技术成熟,栈上分配、标量替换,对象实例开始不一定分配在堆上
  • JAVA堆是垃圾收集器管理的主要区域
  • 也被称为GC堆(Garbage Collected Heap)
  • 根据JAVA虚拟机规范规定,JAVA堆物理上可以位于不连续的内存空间中,只要逻辑上连续即可

知识点

  • 基于OpenJDK深度定制的TaoBaoVM,使用GCIH(GC invisible heap)技术实现off-heap,将生命周期较长的JAVA对象从heap中移至heap外,且GC不能管理GCIH内部的JAVA对象,以此达到降低GC回收频率和提升GC回收效率的目的
  • 逃逸分析
  • 栈上分配
  • JAVA Heap将不再是JAVA对象内存分配的唯一选择

JAVA Heap分代

  • 新生代(Young Generation)
  • 老生代(Old Generation):Tenured
  • Survivor Space通常又称为S0和S1,或者From和To

results matching ""

    No results matching ""