JVM-017-运行时数据区-堆(Heap)-对象分配的过程

概述

为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。

阅读更多

JVM-016-运行时数据区-堆(Heap)-年轻代和老年代

定义

  • 存储在 JVM 中的 Java 对象可以被划分为两类:
    • 一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速
    • 另外一类对象的生命周期却非常长,在某些极端的情况下还能与 JVM 的生命周期保持一致。
  • Java 堆区进一步细分的话:可以分为 年轻代(YoungGen)老年代(OldGen)
    • 其中年轻代又可以划分为:Eden(伊甸园)空间Survivor0(幸存者0)空间Survivor1(幸存者1)空间(有时也叫做 from区to区
阅读更多

JVM-014-运行时数据区-堆(Heap)-堆的核心概念

介绍

  • 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域。
  • Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间。
    • 堆内存的大小是可以调节的。
  • 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。
  • 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。
阅读更多

JVM-009-运行时数据区-虚拟机栈-方法返回地址(Return Address)

定义

  • 存放调用方法(栈帧)的 pc寄存器的值
  • 一个方法的结束,有两种方式:
    • 正常执行完成
    • 出现未处理的异常,非正常退出
  • 无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。
阅读更多

JVM-008-运行时数据区-虚拟机栈-动态链接(Dynamic Linking)

定义

  • 动态链接,又叫指向运行时常量池的方法引用
  • 每一个栈帧内部都包含一个指向运行时常量池该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking),比如:invokedynamic 指令
阅读更多

JVM-007-运行时数据区-虚拟机栈-操作数栈(Operand Stack)

定义

栈的含义:先进后出,可以使用数组或链表来实现,但不具有数组或链表的特性(任意位置增删改等)

而操作数栈的含义:只是使用了数组来存储实现的栈,即按照顺序存放,有索引,但是并非采用访问索引的方式来进行数据访问的,只能通过入栈和出栈来操作数据

每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-Out)操作数栈,也可以称为 表达式栈(Expression Stack)

阅读更多