Java虚拟机的内存结构

合集下载

java内存结构

java内存结构

java内存结构Java的内存结构JVM的内存结构主要有三⼤块:堆、⽅法区和栈。

堆内存是JVM中最⼤的⼀块,由年轻代和⽼年代组成,⽽年轻代内存⼜被分为三部分,Eden空间、FromSurvivor空间和ToSurvivor空间,默认情况下年轻代是按照8:1:1的⽐例来分配。

⽅法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,⽅法区还有⼀个别名Non-Heap(⾮堆);栈⼜分为Java虚拟机栈和本地⽅法栈主要⽤于⽅法的执⾏。

JVM和系统调⽤之间的关系⽅法区和堆是所有线程共享的内存区域;⽽java虚拟机栈、本地⽅法栈和程序员计数器是线程私有的内存区域。

1. Java堆(Heap)对于⼤多数应⽤来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最⼤的⼀块,Java堆是被所有线程共享的⼀块内存区域,在虚拟机启动时创建。

此内存区域的唯⼀⽬的就是存放对象实例,⼏乎所有的对象实例都在这⾥分配内存。

Java堆是垃圾收集器管理的主要区域,因此很多时候也被成为“GC堆”。

如果从内存回收的⾓度看,由于现在收集器基本都是采⽤的分代收集算法,所以Java堆中还可以细分为:新⽣代和⽼年代,再细致⼀点的有Eden空间、From Survivor空间、ToSurvivor空间等。

根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的空间内存中,只要逻辑上是连续的即可,就像我们的磁盘空间⼀样。

在实现时,既可以实现成固定⼤⼩的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。

如果在堆中没有内存完成实例分配,并且堆也⽆法再扩展时,将会抛出OOM(OutOfMemoryError)异常。

2. ⽅法区(Method Area)⽅法区与Java堆⼀样,是各个线程共享的内存区域,它⽤于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,虽然Java虚拟机规范把⽅法区描述为堆的⼀个逻辑部分,但是它有⼀个别名Non-Heap(⾮堆),⽬的应该是与Java堆区分开。

java 虚拟机规范

java 虚拟机规范

java 虚拟机规范Java虚拟机规范(Java Virtual Machine Specification)是由Java语言设计者为了保证Java程序在任何平台上都能够运行,而定义的虚拟机的行为规范。

本文将详细介绍Java虚拟机规范,内容约1000字。

Java虚拟机规范定义了Java虚拟机(JVM)的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。

通过遵循这些规范,开发者可以编写出具有良好可移植性和跨平台性的Java程序。

首先,Java虚拟机规范定义了JVM的结构。

JVM由类加载器、运行时数据区域、执行引擎和本地方法接口等组成。

类加载器负责加载类文件,并进行验证、解析和初始化。

运行时数据区域则包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器等。

执行引擎根据操作码执行相应的指令,并对操作数栈和局部变量表进行操作。

本地方法接口则是Java虚拟机与本地操作系统的接口。

其次,Java虚拟机规范定义了JVM的指令集。

指令集包括了加载、存储、算术运算、类型转换、比较和控制流等各种指令。

每个指令都对应了Java虚拟机的一种行为,可以通过指定操作数来执行相应的操作。

Java虚拟机规范还定义了JVM的运行时数据区域。

运行时数据区域包括了方法区、堆、虚拟机栈、本地方法栈和程序计数器。

方法区用于存储类的结构信息、常量池、静态变量和方法等。

堆用于存储对象实例和数组。

虚拟机栈用于存储方法调用的局部变量表、操作数栈、动态链接和方法返回值等。

本地方法栈用于支持本地方法的调用。

程序计数器则用于记录当前线程执行的字节码指令地址。

此外,Java虚拟机规范还定义了JVM的内存管理、异常处理、线程和同步等方面的规范。

内存管理包括了垃圾收集和内存分配等。

异常处理定义了异常的分类、异常的处理流程和异常的处理方式。

线程规范包括了线程的创建、启动、执行和销毁等。

同步规范则定义了同步的机制和语义。

总结起来,Java虚拟机规范定义了Java虚拟机的行为规范,包括了JVM的结构、指令集、运行时数据区域、内存管理、异常处理、线程和同步等方面的规范。

面试谈jvm原理

面试谈jvm原理

面试谈jvm原理Java虚拟机(JVM)是Java语言运行的基础。

JVM具有封装性、跨平台性、高度优化和可扩展性等特点,是Java应用程序的核心。

在Java的诞生初期,由于硬件环境和操作系统制约,JVM起到了垫底的作用。

而今天,JVM已经成为Java 运行效率和安全性的保障。

下面是一些我认为JVM原理面试时可能会涉及的重点:1. JVM的内存模型:JVM将内存分为堆内存和栈内存,堆内存用于存储对象实例和数组,而栈内存则用于存储方法的执行状态。

同时,JVM还有方法区和永久代的概念。

这些内存区域的大小和分配情况会影响JVM的性能和稳定性。

2. 垃圾回收机制:JVM的内存管理包括垃圾回收机制和内存分配机制。

垃圾回收机制是JVM实现自动内存管理的核心,JVM会周期性地扫描堆内存中没有被引用的对象,并自动回收它们所占用的内存。

垃圾回收机制常用的算法包括标记清除、复制和标记整理等。

3. 类加载机制:Java程序在运行时,需要将类文件中的二进制数据加载到JVM 中,才能执行相应的操作。

类加载机制将类文件加载到JVM中,并将它们解析为Java类。

类加载机制包括三个阶段:加载、链接和初始化。

4. JIT编译器:JIT(Just In Time)编译器是JVM在运行时动态优化的关键组件。

JIT编译器可以在程序运行时,根据代码的执行情况,生成本地机器代码,以提高程序的效率。

5. JVM调优:JVM的性能和稳定性很大程度上取决于JVM参数的设置和调整。

面试时,可能会涉及到如何根据系统的特点和需求,设置JVM参数以达到最佳性能和稳定性的问题。

总之,有关JVM原理的面试问题,往往涉及到JVM的内存模型、垃圾回收机制、类加载机制、JIT编译器和JVM调优等方面。

需要候选人对这些方面有比较深入的了解。

Java虚拟机内存分配探析

Java虚拟机内存分配探析

量分 配 内存空 间 ,当超 过变 量 的作用 域后 , v 会 自动 释放 掉 J a a
为 该 变 量 所 分 配 的 内 存 空 间 ,该 内 存 空 间 可 以 立 即被 另 作 他
用。
享 与 两个 对象 的 引用 同时指 向一 个对 象 的这种 共 享是 不 同的 ,
因 为 这 种 情 况 a的 修 改 并 不 会 影 响 到 b .它 是 由 编 译 器 完 成 的 , 有 利 于 节 省 空 间 。 而 一 个 对 象 引 用 变 量 修 改 了 这 个 对 象 它 的 内部状 态 , 影 响 到另 一个 对象 引用 变量 。 会
间 。对象 通过 nw、e ary等 方式 建立 , 需要 程 序代 码来 显 e nw r a 不
第9 第7 卷 期
2 1 年 7月 00
软 件 导 刊
So t r i e fwa e Gu d
VO . 1 NHale Waihona Puke . 9 7 J . 01 u12 O
Jv a a虚 拟 机 内存 分 配 探 析
胡 雯
( 汉科 技 大 学 中南分校 , 北 武 汉 4 02 ) 武 湖 3 2 3
2 S r g 对 象 举 例 说 明 ti 类 n
Sr g是一 个特 殊 的包装 类 数据 。可 以用 : tn i
Sr gs = e t n (a c ) tn t nw Sr g ”b ” ; i r - i
S r g sr a c ; t n t i =” b ”
是 为 数 组 或 对 象 起 的 一 个 名 称 , 后 就 可 以 在 程 序 中 使 用 栈 中 以 的引用变 量来 访 问堆 中的数 组 或对 象 。 Jv aa是 自动 管 理 栈 和 堆 , 序 员 不 能 直 接 地 设 置 栈 或 堆 。 程 Jv aa的堆 是 一 个 运 行 时 数 据 存 储 区 , 的 对 象 从 中 分 配 空 类

jvm规范

jvm规范

jvm规范JVM(Java虚拟机)是Java语言的核心和关键部分,它是在Java程序运行过程中执行字节码的虚拟计算机。

JVM规范(Java Virtual Machine Specification)定义了JVM的结构、行为和规范。

JVM规范的第一部分是关于虚拟机结构的描述。

JVM由如下几个组成部分:类加载器、执行引擎、运行时数据区和本地方法接口。

类加载器负责将字节码文件加载到JVM中,执行引擎则负责执行字节码指令。

运行时数据区包括堆、栈、方法区等,用来存储程序的数据和执行过程中的临时数据。

本地方法接口允许JVM调用本地方法(非Java语言实现的方法)。

JVM规范的第二部分是关于虚拟机指令集的描述。

Java源代码经过编译后生成字节码文件,字节码中包含了一系列指令。

JVM规范定义了这些指令的编码和执行方式。

一些常见的指令包括加载和存储指令、算术和逻辑指令、跳转指令等。

通过这些指令,JVM可以实现各种操作,比如对变量的赋值、条件判断和循环等。

JVM规范的第三部分是关于类文件格式的描述。

Java源代码经过编译后生成的字节码文件就是类文件,它包含了类的结构、字段、方法等信息。

JVM规范定义了类文件的格式,包括魔数、版本号、常量池、访问标志、字段表、方法表等部分。

通过解析类文件,JVM可以加载和验证类的结构,以及执行其中的方法。

JVM规范的第四部分是关于运行时数据区的描述。

运行时数据区包括堆、栈、方法区等部分,它们分别用来存储对象、方法参数和局部变量、类的结构信息等。

JVM规范定义了这些数据区的组织方式和内存分配策略。

比如,堆用于存储对象实例,栈用于存储方法的局部变量和方法参数,方法区用于存储类的结构信息和常量池。

最后,JVM规范还包括一些附录,包括与Java语言关键字的映射、可选的特性和扩展等内容。

这些附录不是必需的,但对于理解和使用JVM是有帮助的。

总结来说,JVM规范是Java程序运行的基础,它定义了JVM 的结构、行为和规范。

java内存使用情况的命令

java内存使用情况的命令

java内存使用情况的命令Java是一种面向对象的编程语言,它在开发应用程序时需要使用内存来存储数据和执行代码。

因此,了解Java的内存使用情况对于开发人员来说是非常重要的。

Java虚拟机(JVM)负责管理Java应用程序的内存,它使用垃圾回收机制来自动管理内存的分配和释放。

JVM的内存可以分为以下几个部分:1. 堆(Heap):堆是Java程序运行时动态分配的内存区域,用于存储对象实例。

堆的大小可以通过命令行参数-Xmx和-Xms来设置。

-Xms表示JVM启动时初始分配的堆内存大小,-Xmx表示堆能够达到的最大内存大小。

2. 方法区(Method Area):方法区用于存储已加载的类信息、常量、静态变量等数据。

方法区的大小可以通过命令行参数-XX:PermSize和-XX:MaxPermSize来设置。

-XX:PermSize表示JVM启动时初始分配的方法区大小,-XX:MaxPermSize表示方法区能够达到的最大大小。

3. 栈(Stack):栈用于存储Java方法中的局部变量以及方法调用时的状态信息。

每个Java线程都有一个独立的栈,栈的大小是固定的,并且在线程创建时被分配。

栈的大小可以通过命令行参数-Xss来设置。

除了上述部分,JVM还会使用一些额外的内存空间,如直接内存(DirectMemory)和本地方法栈(Native Method Stack),用于存储一些特殊的数据和执行本地方法。

了解Java的内存使用情况对于定位内存泄漏和优化程序性能非常有帮助。

下面是几个常用的命令,可以用于监控和调整Java程序的内存使用情况:1. jps:该命令用于列出当前运行的Java进程,以及对应的进程ID。

2. jstat:该命令用于监控Java虚拟机的各种运行状态,包括堆的使用情况、类加载数量、垃圾回收情况等。

常用的参数包括-jstat -gcutil <pid>和-jstat-gccapacity <pid>。

jvm stackmaptable原理

jvm stackmaptable原理

jvm stackmaptable原理目录1.JVM 内存结构概述2.StackMapTable 的作用和定义3.StackMapTable 的结构和内容4.StackMapTable 的生成与使用5.StackMapTable 在 JVM 中的重要性正文一、JVM 内存结构概述在 Java 虚拟机(JVM)中,内存结构主要分为堆内存(Heap Memory)和栈内存(Stack Memory)。

堆内存主要用于存储对象实例,而栈内存用于存储局部变量和方法调用。

在 JVM 的栈内存中,有一个重要的数据结构——StackMapTable,它对 Java 程序的运行具有重要意义。

二、StackMapTable 的作用和定义StackMapTable,又称为栈映射表,是一个描述 Java 方法调用过程的数据结构。

它记录了 Java 字节码中每一条指令在栈内存中的位置,以及该指令所操作的栈帧(Stack Frame)的类型。

StackMapTable 在编译阶段由编译器生成,并在程序运行时由 JVM 使用。

三、StackMapTable 的结构和内容StackMapTable 是一个数组,它的每一个元素称为一个栈映射项(Stack Mapping Entry)。

每个栈映射项包含以下三个信息:1.偏移量(Offset):表示该栈映射项在内存中的位置。

2.栈帧类型(Frame Type):表示该栈映射项所对应的栈帧的类型,例如:局部变量、操作数栈、方法调用等。

3.指令索引(Instruction Index):表示该栈映射项对应的 Java 字节码指令在字节码文件中的位置。

四、StackMapTable 的生成与使用1.生成:在编译阶段,编译器会根据 Java 字节码文件生成StackMapTable。

编译器会将每一条字节码指令以及与之相关的栈操作信息(如:入栈、出栈、使用栈顶元素等)记录到 StackMapTable 中。

jvm原理

jvm原理

JVM 原理解释JVM 全称是 Java Virtual Machine ,Java 虚拟机,这个 JVM 你是看不到的,它存在内存中。

我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个 JVM 也是有这成套的元素,运算器是当然是交给硬件 CPU 还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集,JVM 的命令集则是可以到处运行的,因为 JVM 做了翻译,根据不同的CPU ,翻译成不同的机器语言。

JVM 是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中。

JVM 的组成部分Class Loader 类加载器类加载器的作用是加载类文件(.class)到内存,Class Loader 加载的 class 文件是有格式要求的。

类加载的最终产品是位于运行时数据区的堆区的Class对象。

Class对象封装了类在方法区内部的数据结构。

并且向JAVA程序提供了访问类在方法区内的数据结构。

JVM加载class文件的原理机制1. Java 中的所有类,必须被装载到 JMV 中才能运行,这个装载工作是由 JVM 中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中。

2. Java中的类大致分为三种:a) 系统类b) 扩展类c) 由程序员自定义的类3. 类装载方式,有两种:a) 隐式装载,程序在运行过程中当碰到通过 new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

b) 显式装载,通过 class.forname() 等方法,显式加载需要的类。

4. 类加载的动态性体现一个应用程序总是由n多个类组成,Java 程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到 JVM 中,其它类等到 JVM 用到的时候再加载,这样的好处是节省了内存的开销。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我们都知道虚拟机的内存划分了多个区域,并不是一张大饼。

那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快。

是的,如果不进行区域划分,扔的时候确实痛快,可用的时候再去找怎么办呢,这就引入了第一个问题,分类管理,类似于衣柜,系统磁盘等等,为了方便查找,我们会进行分区分类。

另外如果不进行分区,内存用尽了怎么办呢?这里就引入了内存划分的第二个原因,就是为了方便内存的回收。

如果不分,回收内存需要全部内存扫描,那就慢死了,内存根据不同的使用功能分成不同的区域,那么内存回收也就可以根据每个区域的特定进行回收,比如像栈内存中的栈帧,随着方法的执行栈帧进栈,方法执行完毕就出栈了,而对于像堆内存的回收就需要使用经典的回收算法来进行回收了,所以看起来分类这么麻烦,其实是大有好处的。

提到虚拟机的内存结构,可能首先想起来的就是堆栈。

对象分配到堆上,栈上用来分配对象的引用以及一些基本数据类型相关的值。

但是·虚拟机的内存结构远比此要复杂的多。

除了我们所认识的(还没有认识完全)的堆栈以外,还有程序计数器,本地方法栈和方法区。

我们平时所说的栈内存,一般是指的栈内存中的局部变量表。

下面是官方所给的虚拟机的内存结构图
从图中可以看到有5大内存区域,按照是否被线程所共享可分为两部分,一部分是线程独占区域,包括Java栈,本地方法栈和程序计数器。

还有一部分是被线程所共享的,包括方法区和堆。

什么是线程共享和线程独占呢,非常好理解,我们知道每一个Java进行都会有多个线程同时运行,那么线程共享区的这片区域就是被所有线程一起使用的,不管有多少个线程,这片空间始终就这一个。

而线程的独占区,是每个线程都有这么一份内存空间,每个线程的这片空间都是独有的,有多少个线程就有多少个这么个空间。

上图的区域的大小并不代表实际内存区域的大小,实际运行过程中,内存区域的大小也是可以动态调整的。

下面来具体说说每一个区域的主要功能。

程序计数器,我们在写代码的过程中,开发工具一般都会给我们标注行号方便查看和阅读代码。

那么在程序在运行过程中也有一个类似的行号方便虚拟机的执行,就是程序计数器,在c语言中,我们知道会有一个goto语句,其实就是跳转到了指定的行,这个行号就是程序计数器。

存储的就是程序下一条所执行的指令。

这部分区域是线程所独享的区域,我们知道线程是一个顺序执行流,每个线程都有自己的执行顺序,如果所有线程共用一个程序计数器,那么程序执行肯定就会出乱子。

为了保证每个线程的执行顺序,所以程序计数器是被单个线程所独显的。

程序计数器这块内存区域是唯一一个在jvm规范中没有规定内存溢出的。

java虚拟机栈,java虚拟机栈是程序运行的动态区域,每个方法的执行都伴随着栈帧的入栈和出栈。

栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。

栈帧中包括了局部变量表,操作数栈,方法返回地址以及额外的一些附加信息,在编译过程中,局部变量表的大小已经确定,操作数栈深度也已经确定,因此栈帧在运行的过程中需要分配多大的内存是固定的,不受运行时影响。

对于没有逃逸的对象也会在栈上分配内存,对象的大小其实在运行时也是确定的,因此即使出现了栈上内存分配,也不会导致栈帧改变大小。

一个线程中,可能调用链会很长,很多方法都同时处于执行状态。

对于执行引擎来讲,活动线程中,只有栈顶的栈帧是最有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。

执行引擎所运行的字节码指令仅对当前栈帧进行操作。

局部变量表:我们平时所说的栈内存一般就是指栈内存中的局部变量表。

这里主要是存储变量所用。

对于基本数据类型直接存储其值,对于引用数据类型则存储其地址。

局部变量表的最小存储单位是Slot,每个Slot都能存放一个boolean、byte、char、short、int、float、reference或returnAddress类型的数据。

既然前面提到了数据类型,在此顺便说一下,一个Slot可以存放一个32位以内的数据类型,Java中占用32位以内的数据类型有boolean、byte、char、short、int、float、reference 和returnAddress八种类型。

前面六种不需要多解释,大家都认识,而后面的reference 是对象的引用。

虚拟机规范既没有说明它的长度,也没有明确指出这个引用应有怎样的结构,但是一般来说,虚拟机实现至少都应当能从此引用中直接或间接地查找到对象在Java堆中的起始地址索引和方法区中的对象类型数据。

而returnAddress是为字节码指令jsr、jsr_w 和ret服务的,它指向了一条字节码指令的地址。

对于64位的数据类型,虚拟机会以高位在前的方式为其分配两个连续的Slot空间。

Java 语言中明确规定的64位的数据类型只有long和double两种(reference类型则可能是32位也可能是64位)。

值得一提的是,这里把long和double数据类型读写分割为两次32读写的做法类似。

不过,由于局部变量表建立在线程的堆栈上,是线程私有的数据,无论读写两个连续的Slot是否是原子操作,都不会引起数据安全问题。

操作数栈是一个后入先出(Last In First Out, LIFO)栈。

同局部变量表一样,操作数栈的最大深度也在编译的时候被写入到字节码文件中,关于字节码文件,后面我会具体的来描述。

操作数栈的每一个元素可以是任意的Java数据类型,包括long和double。

32位数据类型所占的栈容量为1,64位数据类型所占的栈容量为2。

在方法执行的任何时候,操作数栈的深度都不会超过在max_stacks数据项中设定的最大值。

当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令向操作数栈中写入和提取内容,也就是入栈出栈操作。

例如,在做算术运算
的时候是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。

举个例子,整数加法的字节码指令iadd在运行的时候要求操作数栈中最接近栈顶的两个元素已经存入了两个int型的数值,当执行这个指令时,会将这两个int值和并相加,然后将相加的结果入栈。

操作数栈中元素的数据类型必须与字节码指令的序列严格匹配,在编译程序代码的时候,编译器要严格保证这一点,在类校验阶段的数据流分析中还要再次验证这一点。

再以上面的iadd指令为例,这个指令用于整型数加法,它在执行时,最接近栈顶的两个元素的数据类型必须为int型,不能出现一个long和一个float使用iadd命令相加的情况。

本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。

甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。

与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

方法区经常会被人称之为永久代,但这俩并不是一个概念。

首先永久代的概念仅仅在HotSpot虚拟机中存在,不幸的是,在jdk8中,Hotspot去掉了永久代这一说法,使用了Native Memory,也就是Metaspace空间。

那么方法区是干嘛的呢?我们可以这么理解,
我们要运行Java代码,首先需要编译,然后才能运行。

在运行的过程中,我们知道首先需要加载字节码文件。

也就是说要把字节码文件加载到内存中。

好了,问题就来了,字节码文件放到内存中的什么地方呢,就是方法区中。

当然除了编译后的字节码之外,方法区中还会存放常量,静态变量以及及时编译器编译后的代码等数据。

堆,一般来讲堆内存是Java虚拟机中最大的一块内存区域,同方法区一样,是被所有线程所共享的区域。

此区域所存在的唯一目的就存放对象的实例(对象实例并不一定全部在堆中创建)。

堆内存是垃圾收集器主要光顾的区域,一般来讲根据使用的垃圾收集器的不同,堆中还会划分为一些区域,比如新生代和老年代。

新生代还可以再划分为Eden,Survivor等区域。

另外为了性能和安全性的角度,在堆中还会为线程划分单独的区域,称之为线程分配缓冲区。

更细致的划分是为了让垃圾收集器能够更高效的工作,提高垃圾收集的效率。

如果想要了解更多的关于虚拟机的内容,欢迎观看录制的<深入理解Java虚拟机>这套视频。

相关文档
最新文档