JVM内存结构总结

JVM内存结构总结归纳

本文将着重介绍JVM的内存结构,总结其特点。这也是作者学习过程中的总结归纳,如有错误欢迎指正。
我们先从下图了解JVM,即Java虚拟机。

JVM内存结构,也叫作运行时数据区,是我们最关心的区域。

程序计数器

Java是支持多线程的,且线程的执行是抢占式调度模型,即各个线程抢夺CPU时间片。为了满足线程切换后能恢复到正确的执行位置,每个线程就有了自己的程序计数器,以记录线程中下一条指令的执行地址。

特点归纳:

  1. 程序计数器是线程私有的。
  2. 程序计数器是运行时数据区中唯一不会发生内存泄漏的区域。

虚拟机栈(JVM Stacks)

虚拟机栈是一个线程执行的区域,用来存储栈帧。下面先来了解几个概念:

  • 栈:简单来说,就是先进后出,是线程的运行空间
  • 栈帧:是方法的运行空间,随方法的调用而创建(入栈),随方法的结束而销毁(出栈)。每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回值地址。
  • 局部变量表:顾名思义,就是用来存储局部变量。在java文件的编译期间就确定了局部变量表的最大容量。
  • 操作数栈:方法内的操作,如自增、相加、赋值等等,都要将相应的数据入栈,以完成对应的操作。
  • 动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。Class文件中有大量的符号引用,一部分会在类加载中的解析阶段转化为直接引用,这种转化成为静态解析;而一部分会在运行时动态地转化为直接引用,称为动态链接。
  • 方法返回值地址:由调用者的程序计数器的值确定方法结束后返回的地址。

虚拟机栈的执行过程:在这里插入图片描述

特点归纳:

1.java虚拟机栈是线程私有的,随线程的创建而创建,有多少个线程,就会开辟多少个相互独立的虚拟机栈。
2.每调用一个方法,就会在虚拟机栈中压入一个栈帧,该方法内部再调用其他方法,则会压入新的栈帧,方法结束后将栈帧弹出栈。

JVM启动时就创建,是所以类实例和数组对象分配内存的区域,被所有线程共享。
特点归纳:

  1. 堆的空间可以是固定的,也可以随着程序需求动态的扩展,并在不需要过多空间是自动收缩。堆的内存空间不需要保证是连续的。
  2. 堆中的对象都需要考虑线程安全。
  3. 有垃圾回收机制

方法区

在Java虚拟机中,方法区是可以供各个线程共享的运行时内存区域。他存储了一个类的结构信息,如常量池、类的相关信息、类加载器。
方法区在JDK6或7中就是Perm Space【 永久代】
在这里插入图片描述
在JDK 8中就是Metaspace【 元空间】
在这里插入图片描述
特点归纳:

  1. 方法区是各个线程共享的内存区域, 在虚拟机启动时创建。
  2. 用于存储已被虚拟机加载的类信息、 常量、 静态变量等。
  3. 虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分, 但是它却又一个别名叫做Non-Heap(非堆), 目的是与Java堆区分开来。

本地方法栈

对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时, 这些方法就会在本地方法栈中执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值