Java -----JVM运行时数据区
一、JVM体系结构
想要了解运行时数据区,先关注一下JVM的体系结构,知道数据区在JVM的整体位置和作用。
二、JVM运行时数据区
1.程序计数器
一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支、跳转、循环等基础功能都要依赖它来实现。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。
当线程在执行一个Java方法时,该计数器记录的是正在执行的虚拟机字节码指令的地址,当线程在执行的是Native方法(调用本地操作系统方法)时,该计数器的值为空。另外,该内存区域是唯一一个在Java虚拟机规范中没有规定任何OOM(内存溢出:OutOfMemoryError)情况的区域。
2.Java虚拟机栈—JVM Stacks
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,java虚拟机对Java栈的两种操作:以帧为单位的压栈和弹栈。
每当线程调用一个Java方法是,虚拟机都会在该线程的Java栈中亚茹一个新的栈帧。而这个栈帧存储着该方法的参数,局部变量,中间运算结果等等数据。
栈帧
由三部分组成:局部变量、操作数栈和帧数据区
局部变量:包含对应方法的参数和局部变量,局部变量区是以字长为单位存储数据的,并且是一个从0开始计数的数组空间,数据类型int 、float、对象的引用reference和returnAddress被存储在一个存储空间,而类型byte、short和char的值存入数组前都会被转换成int值。一次也是占据一个存储空间,long和double在数组中占据连续的两个存储空间。
可以看到在0的位置会存储一个隐含的变量this,用老表示调用该方法的对象本身。
而类方法并没有this,因为类方法只与类相关。而与具体的对象无关。
操作数栈
虚拟机在操作数栈中存储的是方法运算的操作数和运算结果,操作方式是压栈和出栈,数据的存储方式和上面说的局部变量存储方式是一样的。
Java虚拟机中国是没有寄存器的,这也是符合JVM平台无关特性的一点,虚拟机把操作数栈作为他的工作区,大多数指令都会从这里弹出数据,执行运算,然后再把结果压回操作数栈
帧数据区
Java栈帧还需要一些数据来支持常量池解析、正常方法返回以及异常派发机制,这些信息都被保存在Java栈帧的帧数据区中
3.本地方法栈(Native Method Stacks)
该区域与虚拟机栈所发挥的作用非常相似,只是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的本地操作系统(Native)方法服务。
4.Java堆(Java Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
5.方法区域(Method Area)
方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。
在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。
在JVM规范中,没有强制要求方法区必须实现垃圾回收。很多人习惯将方法区称为“永久代”,是因为HotSpot虚拟机以永久代来实现方法区,从而JVM的垃圾收集器可以像管理堆区一样管理这部分区域,从而不需要专门为这部分设计垃圾回收机制。不过自从JDK7之后,Hotspot虚拟机便将运行时常量池从永久代移除了。
总结:
转载于:https://www.cnblogs.com/Actexpler-S/p/7668662.html
Java -----JVM运行时数据区相关推荐
- Java内存管理:Java内存区域 JVM运行时数据区
Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程.Class文件结构.以及JVM字节码指令. 下面我们详细了解Java内存区域:先说明JVM规范定 ...
- 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!
受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...
- JVM运行时数据区分析
#1.概述 整个JVM构成⾥⾯,由三部分组成:类加载器机制.运⾏时数据区.执⾏引擎. #2.JVM运行时数据区的规范 我们来聊聊这个规范怎么理解,目前运行数据区共分为了方法区.堆.虚拟机栈.本地方法栈 ...
- JVM运行时数据区和各个区域的作用
一.JVM主要分为5个核心区域(6个子区域),分别是: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 *运行时常量池(属于"方法区"的一部分) 二.各个区域作用和描 ...
- 掌握JVM 运行时数据区,其实不是很难,加薪也是要技巧可言的!!!
一.概念 Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程 ...
- JVM运行时数据区概览
在学习JVM之前我们需要明确的是,我们所学习的是JVM的一个规范,在实际中有很多不同种类的虚拟机来实现这一种规范.其次JVM运行时数据区和JMM的区别我们要搞清楚,不能将JMM理解为JVM运行是数据区 ...
- 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...
- java 线程栈大小配置,JVM运行时数据区详解-Stack栈(优化配置、代码样例)
最近有段时间没有更新Netty的教程了,却发了一些其他的东西.可能有的朋友会问,难道这就完事了?不会的.两方面原因.第一.笔者也是需要工作的人,自然要完成好工作中的任务,这里面也有很多东西需要学习和研 ...
- Java程序员必知必会之JVM运行时数据区
JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...
最新文章
- python解释器可以使用什么命令_python解释器用什么写的
- UVa439 Knight Move 骑士的移动(bfs)
- Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)
- 2019年物联网发展趋势与预测分析
- 久其报表大厅_天下苦“数”久矣,大数据分析平台解决物流数据孤岛
- 如何使用VS2017将客户端库添加到ASP.NET CORE 2.2(简单方法)
- css伪类选择器,:link、:visited、:focus、:hover、:active、:first-child
- 20170923在线编程之输入年、月、日输出这是一年的第几天
- 分享-追书神器旧版本-无广告、可换源看小说
- AGV搬运机器人磁导航传感器D-MNSV7-X16安装方法与注意事项
- catia批量转stp文件格式_CATIA,UG,PROE等等格式批量转成stp,step,igs,iges
- REVIT建模“族类别和族参数”中的“总是垂直”“基于工作平面”怎么用?
- UVa 10101 - Bangla Numbers
- 读写 400MB/s 固态U盘轻松应对 Windows To Go
- Unity2019学习:常用功能--Camera摄像机
- 如何在控制台打开jar包
- 想告别繁琐的工作?你可能需要这个。
- windows命令行安装Drupal7(包括drush安装与配置)
- 对接新泰构建实体模式 李刚:金谷诺亚元宇宙赋能产业体系
- 分清概念十分重要系列之--说说人工智能中的各种学习
热门文章
- pandas合并groupby_Pandas-GroupBy,然后在原始表上合并
- 不显示参数名_Houdini自定义参数Folder的几种模式
- linux重装出现cannot load file 5555h,重装win7系统开机提示cannot load file code:5555h怎么办...
- phpcms 加载php文件,PHPCMS配置文件的读取
- python数据分类_Python数据挖掘实践—KNN分类
- 数学--数论--质数处理
- [深度学习] 自然语言处理 --- ALBERT 介绍
- 三种常用SoC片上总线的分析与比较 (Z)
- PCB生成光绘文件教程 (Z)
- PHP 与 Perl 对照表