JVM——运行时数据区

前言

          由于JAVA程序是交由JVM执行的,所以我们所说的JAVA内存区域划分也是指的JVM内存区域划分,JAVA程序具体执行的过程如下图所示。首先Java源代码文件会被Java编译器编译为字节码文件,然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。

 一、运行时数据区组成

线程共享数据区:方法区、堆

线程隔离数据区:虚拟机栈、本地方法栈、堆、程序计数器

 1、程序计数器(PC寄存器)

(1)JVM支持多个线程同时运行,每个线程拥有一个程序计数器,是线程私有的,用来存储指向下一条指令的地址。

(2)如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。

(3)由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。也是内存区域中唯一一个没有规定任何OutOfMemoryError情况的区域。

2、虚拟机栈

(1)栈是由一系列帧(Frame)组成(因此Java栈也叫作帧栈),是线程私有的。

(2)帧是用来保存一个方法的局部变量、操作数栈(java没有寄存器,所有的参数传递使用操作数栈)、常量池指针、动态链接、方法返回值等。

(3)当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。

(4)由于每个线程正在执行的方法可能不同,因此每个线程都会有一个自己的Java栈,互不干扰。

虚拟机栈特点:

(1)局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)以及对象引用。
(2)如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

 

补充:

(1)栈的优点:存取速度比堆快,仅次于程序计数器。

(2)栈的缺点:存在栈中的数据太小,生存期是在编译期决定的,缺乏灵活性。

(3)StackOverflowError异常:当线程请求的栈深度大于虚拟机所允许的深度。

(4)OutOfMemoryError异常:如果栈的扩展时无法申请到足够的内存。

3、Java堆

(1)JAVA堆是内存区域中一块用来存放对象实例的区域(几乎所有的对象实例都在这里分配内存),此内存区域的唯一目的就是存放对象实例。

(2)JAVA堆(Java Heap)是java虚拟机所管理的内存中最大的一块,java堆是被所有线程共享的一块内存区域。

Java堆的特点:

(1)Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”(GC主要管理堆空间,对分代GC来说,堆也是分代的)

(2)Java堆可以分成新生代和老年代,新生代可分为To Space、From Space、Eden。

 补充:

(1)堆的优点:运行期动态分配内存大小,自动进行垃圾回收。

(2)堆的缺点:效率相对较慢。

4、方法区

 (1)方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

(2)在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。

运行时常量池:

(1)是Class文件中每个类或接口的常量池表,在运行期间的表示形式,通常包括:类的版本、字段、方法、接口等信息。

(2)当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

5、本地方法栈

(1)在JVM中用来支持native方法执行的栈就是本地方法栈。

(2)本地方法栈与Java栈的作用和原理非常相似,区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的 。

(3)在JVM规范中,并没有对本地方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

二、JVM内存区域细化

 1、栈、堆、方法区交互关系

2、Java堆的结构

 

 3、对象

3.1、对象的内存布局

对象在内存中存储的布局(这里以HotSpot虚拟机为例说明),分为:对象头、实例数据和对齐填充。

3.2、对象头包含两个部分

(1)Mark Word:用于存储对象自身的运行时数据,如:HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等。

(2)类型指针:对象指向它的类元数据的指针。

3.3、对象的访问定位

在JVM规范中只规定了reference类型是一个指向对象的的引用,但没有规定这个引用具体如何去定位,访问堆中对象的具体位置。因此对象的访问方式取决于JVM的具体实现,目前主流的有:使用句柄、使用指针两种方式。

(1)使用句柄

 Java堆中会划分出一块内存来做句柄池,reference中存储句柄地址,句柄中存储对象的实例数据和类元数据的地址。

(2)使用指针

 

(3)各自优势: 

 句柄访问:reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改。 

直接指针访问:速度快,它节省了一次指针定位的时间开销,由于对象的访问在JAVA中非常频繁,因此这类开销积少成多后也是非常可观的执行成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/562950.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Typecho如何去掉/隐藏index.php

Typecho后台设置永久链接后,会在域名后加上index.php,很多人都接受不了。例如如下网址:https://www.jichun29.cn/index.php/archives/37/,但我们希望最终的形式是这样:https://www.jichun29.cn/archives/37.html。那么…

【数据结构】顺序表习题之移除元素和合并两个有效数组

👑个人主页:啊Q闻 🎇收录专栏:《数据结构》 🎉道阻且长,行则将至 前言 嗨呀,今天的博客是关于顺序表的两道题目,是力扣的移除元素和合并有序数组的题目。 一.移除…

第十四届蓝桥杯大赛软件赛省赛Java大学B组

最近正在备考蓝桥杯,报的java b组,顺便更一下蓝桥的 幸运数字 题目 思路:填空题,暴力即可 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {static int trans(int x, int y){int …

git基础-查看提交历史

查看提交历史 在创建了多个提交之后,或者如果克隆了一个具有现有提交历史的存储库,可能会想要回顾一下发生了什么。最基本和强大的工具就是 git log 命令。 运行下git log查看下输出状态 默认情况下,不带任何参数运行 git log 命令会以逆时…

使用 VMWare 安装 Android-x86 系统(小白版)

文章目录 VMWare 介绍Android 系统介绍概述最终效果前置步骤开始安装 VMWare 介绍 VMware Workstation是VMware公司开发的一款桌面虚拟化软件。它允许用户在一台物理计算机上同时运行多个操作系统,每个操作系统都在自己的虚拟机中运行。这使得用户可以在同一台计算…

区块链技术下的新篇章:DAPP与消费增值的深度融合

随着区块链技术的持续演进,去中心化应用(DAPP)正逐渐受到人们的瞩目。DAPP,这种在分布式网络上运行的应用,以其去中心化、安全可靠、透明公开的特性,为用户提供了更为便捷和安全的消费体验。近年来&#xf…

Linux 常用命令 1

Tips:终端热键ctrl shift 放大终端窗口的字体 ctrl - 缩小终端窗口的字体 注意区分大小写 查阅命令帮助信息: 1)--help command –help(两个减号) 显示command命令的帮助信息 2)man man command 查阅command命令的使…

PAT题解 --- 寻宝图

今天是PTA题库解法讲解的第十天,今天我们要讲解浪漫侧影,题目如下: 题解思路: 要解决这个问题,可以使用深度优先搜索(DFS)方法来遍历每一个陆地或宝藏格子,标记所有与之相连的格子…

MySQL表内容的增删查改

在前面几章的内容中我们学习了数据库的增删查改,表的增删查改,这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.创建Create 我们先创建…

linux centos 安装jenkins,并构建spring boot项目

首先安装jenkins,使用war包安装,比较简单,注意看下载的版本需要的JDK版本,官网下载https://www.jenkins.io/download/ 把下载好的war包放到服务器上,然后运行,注意8080端口的放行 # 前台运行并指定端口 ja…

基于Matlab的眼底图像血管分割,Matlab实现

博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…

腾讯云GPU云服务器_并行计算_弹性计算_AI_深度学习

腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…