首页 > 其他分享 >运行时数据区

运行时数据区

时间:2024-07-16 23:10:30浏览次数:12  
标签:Java 常量 方法 虚拟机 线程 JVM 数据 运行

  • Java 源代码文件经过编译器编译后会生成字节码文件,经过加载器加载完毕后会交给执行引擎执行。在执行的过程中,JVM 会划出来一块空间来存储程序执行期间需要用到的数据,这块空间一般被称为运行时数据区

根据 Java 虚拟机规范的规定,运行时数据区可以分为以下几个部分:

  • 程序计数器(Program Counter Register)
  • Java 虚拟机栈(Java Virtual Machine Stacks)
  • 本地方法栈(Native Method Stack)
  • 堆(Heap)
  • 方法区(Method Area)

JDK 8 开始,永久代被彻底移除,取而代之的是元空间。元空间不再是 JVM 内存的一部分,而是通过本地内存(Native Memory)来实现的。也就是说,JDK 8 开始,方法区的实现就是元空间。

程序计数器PC


  • 为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,并且不能互相干扰

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

Java虚拟机栈


  • Java 虚拟机栈(JVM 栈)中是一个个栈帧,每个栈帧对应一个被调用的方法。当线程执行一个方法时,会创建一个对应的栈帧,并将栈帧压入栈中。当方法执行完毕后,将栈帧从栈中移除。

  • Java 虚拟机栈的特点如下:

    • 线程私有: 每个线程都有自己的 JVM 栈,线程之间的栈是不共享的。
    • 栈溢出: 如果栈的深度超过了 JVM 栈所允许的深度,将会抛出 StackOverflowError
  • 通过 java -XX:+PrintFlagsFinal -version | grep ThreadStackSize 这个命令可以查看 JVM 栈的默认大小。

本地方法栈


本地方法栈(Native Method Stack)与 Java 虚拟机栈类似,只不过 Java 虚拟机栈为虚拟机执行 Java 方法服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。


  • 堆是所有线程共享的一块内存区域,在 JVM 启动的时候创建,用来存储对象(数组也是一种对象)。

  • 以前,Java 中“几乎”所有的对象都会在堆中分配,但随着 JIT 编译器的发展和逃逸技术的逐渐成熟,所有的对象都分配到堆上渐渐变得不那么“绝对”了。从 JDK 7 开始,Java 虚拟机已经默认开启逃逸分析了,意味着如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存。

  • 常见的编译型语言如 C++,通常会把代码直接编译成 CPU 所能理解的机器码来运行。而 Java 为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由 javac 编译成通用的中间形式——字节码,然后再由解释器逐条将字节码解释为机器码来执行。

  • 为了优化 Java 的性能 ,JVM 在解释器之外引入了 JIT 编译器:当程序运行时,解释器首先发挥作用,代码可以直接执行。随着时间推移,即时编译器逐渐发挥作用,把越来越多的代码编译优化成本地代码,来获取更高的执行效率。解释器这时可以作为编译运行的降级手段,在一些不可靠的编译优化出现问题时,再切换回解释执行,保证程序可以正常运行。

  • 逃逸分析(Escape Analysis)是一种编译器优化技术,用于判断对象的作用域和生命周期。如果编译器确定一个对象不会逃逸出方法或线程的范围,它可以选择在栈上分配这个对象,而不是在堆上。这样做可以减少垃圾回收的压力,并提高性能。

  • 堆除了是对象的聚集地,也是 Java 垃圾收集器 管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap)。从垃圾回收的角度来看,由于垃圾收集器基本都采用了分代垃圾收集的算法,所以堆还可以细分为:新生代和老年代。新生代还可以细分为:Eden 空间、From Survivor、To Survivor 空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。

  • 堆这最容易出现的就是 OutOfMemoryError 错误,分为以下几种表现形式:

    • OutOfMemoryError: GC Overhead Limit Exceeded:当 JVM 花太多时间执行垃圾回收并且只能回收很少的堆空间时,就会发生该错误。
    • java.lang.OutOfMemoryError: Java heap space:假如在创建新的对象时, 堆内存中的空间不足以存放新创建的对象, 就会引发该错误。和本机的物理内存无关,和我们配置的虚拟机内存大小有关!
  • java -XX:+PrintFlagsFinal -version | grep HeapSize可以查看 JVM 堆的默认大小

元空间和方法区


  • 方法区是 Java 虚拟机规范上的一个逻辑区域,在不同的 JDK 版本上有着不同的实现。在 JDK 7 的时候,方法区被称为永久代(PermGen),而在 JDK 8 的时候,永久代被彻底移除,取而代之的是元空间。

  • 元空间的大小不再受限于 JVM 启动时设置的最大堆大小,而是直接利用本地内存,也就是操作系统的内存。有效地解决了 OutOfMemoryError 错误。
  • 方法区(不管是永久代还是元空间的实现)和堆一样,是线程共享的区域

运行时常量池

  • 是字节码文件的资源仓库,先是一个常量池大小,从 1 到 n-1,0 为保留索引,然后是常量池项的集合,包括类信息、字段信息、方法信息、接口信息、字符串常量等。

  • 运行时常量池,顾名思义,就是在运行时期间,JVM 会将字节码文件中的常量池加载到内存中,存放在运行时常量池中。常量池是在字节码文件中,而运行时常量池在元空间当中(JDK 8 及以后)。

字符串常量池

  • 存放字符串常量,也就是我们在代码中写的字符串。依然在堆中。

标签:Java,常量,方法,虚拟机,线程,JVM,数据,运行
From: https://www.cnblogs.com/sprinining/p/18306298

相关文章

  • 【利用Python进行数据分析8】Pandas入门(描述性统计的汇总与计算)
    导包importyfinanceasyfimportpandasaspdimportnumpyasnp1.描述性统计的汇总与计算#1.描述性统计的汇总与计算#数值型数据df=pd.DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=["a","b","c","d"],......
  • 3. 基本数据类型
    1.注释1.1 定义:注释是对代码的解释和说明,注释的内容不会被作为代码执行1.2注释的分类单行注释:#号 +  注释内容 多行注释:三个单引号或三个双引号2.常量和变量2.1变量2.1.1概念:变量是用于存储数据值的标识符,通过变量名访问和操作这些数据特点:在程序中......
  • 数据仓库建模工具之一——Hive学习第二天
    Hive的概述1、Hive基本概念1.1 Hive简介Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步说hive就是一个MapReduce客户端。为什么使用Hive?使用hadoop,成本太高,项目要求周期太......
  • 【Java--数据结构】二叉树
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~树结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合注意:树形结构中,子树之间不能有交集,否则就不是树形结构常见概念  节点的度:一个节点含有子树的个数,如A的度为6......
  • 数据库理论基础
    1.什么是数据库1.1数据描述事物的符号记录,可以是数字、文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。1.2数据库存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和存......
  • Laravel数据库的魔法棒:深入探索数据库迁移(Migrations)
    Laravel数据库的魔法棒:深入探索数据库迁移(Migrations)在Laravel的世界中,数据库迁移(Migrations)是一种强大的工具,它允许开发者以版本控制的方式管理数据库结构的变化。通过迁移,你可以轻松地创建、修改或删除数据库表,同时保持代码的整洁和一致性。本文将带你深入了解Laravel数......
  • 信创学习笔记(四),信创之数据库DB思维导图
    创作不易只因热爱!!热衷分享,一起成长!“你的鼓励就是我努力付出的动力”一.信创学习回顾1.信创内容信创内容思维导图2.信创之CPU芯片架构信创之CPU芯片架构思维导图3.信创之操作系统OS信创之操作系统OS思维导图二.信创之国产数据库DB思维导图用一张图学习......
  • R语言极值分析:GEV与GPD模型与MCMC的海洋观测数据极值模拟可视化研究
    全文链接:https://tecdat.cn/?p=37007原文出处:拓端数据部落公众号在海洋科学领域,极端天气和海洋事件如极端海浪、风暴潮和海啸等,对沿海社区、基础设施及生态环境构成了重大威胁。准确预测和评估这些极端事件的强度和频率,对于制定有效的防灾减灾策略至关重要。极值分析作为统......
  • 极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风
    全文链接:http://tecdat.cn/?p=24182最近我们被客户要求撰写关于极值理论的研究报告,包括一些图形和统计输出。本文用R编程语言极值理论(EVT)以确定10只股票指数的风险价值(和条件VaR)使用Anderson-Darling检验对10只股票的组合数据进行正态性检验,并使用BlockMaxima......
  • PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附
    全文下载链接:http://tecdat.cn/?p=22617最近我们被客户要求撰写关于MRS的研究报告,包括一些图形和统计输出。本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果。它应用了Hamilton(1989)的滤波器和Kim(1994)的平滑器  %matplot......