java 静态变量 存储_java中,类的静态变量如果是对象,该对象将存储在内存的哪个区域?…

java 静态变量 存储_java中,类的静态变量如果是对象,该对象将存储在内存的哪个区域?…静态变量所引用的实例位于Java堆或运行时常量池。Java字节码与Native机器码不同,字节码是运行在JVM这一平台上的,字节码在被解释的过程中,具体的执行方式因JVM的不同实现而不同,但是对于JVM来说,它的各种不同实现都必须要遵循Java虚拟机规范。JVM的运行时数据区包含以下部分:1、PC寄存器每一条Java虚拟机线程都有自己的PC寄存器,如果正在被线程执行的当前方法不是native的,那…

大家好,又见面了,我是你们的朋友全栈君。

静态变量所引用的实例位于Java堆或运行时常量池。

Java字节码与Native机器码不同,字节码是运行在JVM这一平台上的,字节码在被解释的过程中,具体的执行方式因JVM的不同实现而不同,但是对于JVM来说,它的各种不同实现都必须要遵循Java虚拟机规范。JVM的运行时数据区包含以下部分:

1、PC寄存器

每一条Java虚拟机线程都有自己的PC寄存器,如果正在被线程执行的当前方法不是native的,那么PC寄存器就保存Java虚拟机正在执行的字节码指令的地址。

2、Java虚拟机栈

每一条Java虚拟机线程都有自己私有的Java虚拟机栈,这个栈与线程同时创建,用于存储栈帧,栈帧可以在堆中分配,Java虚拟机栈所使用的内存不需要保证是连续的。

3、Java堆

在Java虚拟机中,堆是可供各个线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域,存储了被垃圾收集器所管理的各种对象。

4、方法区

在Java虚拟机中,方法区是可供各个线程共享的运行时内存区域,它存储了每一个类的结构信息。虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集与压缩。从Java6至Java14的虚拟机规范中,都没有限定实现方法区的内存位置和编译代码的管理策略。比如在HotSpot曾经的实现中,它内部的垃圾收集器全都基于“经典分代”来设计,将堆内存划分为新生代、老年代、永久代,其中永久代便是包括类型信息、常量、静态变量、JIT代码缓存等数据的方法区,而到了Java8,HotSpot已经完全废弃了永久代的概念,改用本地内存中实现的元空间来代替。

5、运行时常量池

运行时常量池的功能类似于ELF中的符号表,但是运行时常量池的包含的范围比典型的符号表大。一般来说,除了保存class文件中描述的符号引用外,还会把由符号引用翻译出来的直接引用也存储在运行时常量池中。相对于Class文件常量池来说,运行时常量池具备一个重要特性——动态性,并非预置入Class文件中常量池的内容才能进入运行时常量池,运行期间也可以将新的常量放入池中,比如String的intern方法。

6、本地方法栈

为虚拟机使用到的本地方法服务,具体的虚拟机可以根据需要自由实现它。

根据Java虚拟机规范的限制,由于静态变量所引用的实例可以被各个线程所共享,那么它一定不能位于PC寄存器、Java虚拟机栈、本地方法栈,又由于方法区存储的是类的结构信息而不是实例数据,所以被静态变量所引用的实例一定位于Java堆或运行时常量池。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130585.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月28日 下午10:20
下一篇 2022年4月28日 下午10:20


相关推荐

  • Manus 是大模型 AI Agent + MCP, 那什么是模型上下文协议 (MCP)?

    Manus 是大模型 AI Agent + MCP, 那什么是模型上下文协议 (MCP)?

    2026年3月15日
    2
  • C# 调用java Webservice「建议收藏」

    C# 调用java Webservice「建议收藏」usingMicrosoft.CSharp;usingSystem;usingSystem.CodeDom;usingSystem.CodeDom.Compiler;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Net;usingSystem.Text;us

    2022年10月16日
    4
  • ubuntu 18.04安装edge浏览器

    ubuntu 18.04安装edge浏览器1.先下载适用于Ubuntu的deb格式安装包2.使用sudodpkg-imicrosoft-edge-dev_****_amd64.deb,安装edge3.安装后会发现打不开,运行以下代码sudoaptinstallmicrosoft-edge-dev4.运行sudoaptinstallmicrosoft-edge-dev后,会出现错误:Unmetdependencies.Try’apt–fix-brokeninstall’withn…

    2022年7月21日
    18
  • R语言之for循环

    R语言之for循环假设有一个响亮 t 我们要对它进行 for 循环操作 则

    2026年3月17日
    2
  • Windows 技术篇-LDSGameMaster文件夹有什么用,删除方法

    Windows 技术篇-LDSGameMaster文件夹有什么用,删除方法LDS是鲁大师的拼写,应该是用过鲁大师,偷偷给你安装的。分析:没什么用,流氓程序,还很大占地方,4个G,可以放心的卸掉。卸载方法:找到里面的卸载程序来卸载,卸载完后把文件夹删除就好了。

    2022年6月14日
    70
  • 细致讲解slot插槽的使用

    细致讲解slot插槽的使用彻底搞懂 slot 插槽 图文详解 1 什么是插槽 Vue 实现了一套内容分发的 API 将 元素作为承载分发内容的出口 插槽实质是对子组件的扩展 通过 插槽向组件内部指定位置传递内容 slot 的出现是为了父组件可以堂而皇之地在子组件中加入内容 插槽显不显示 怎样显示是由父组件来控制的 而插槽在哪里显示就由子组件来进行控制 2 slot 与 props 的区别 3 插槽的使用 1 匿名插槽 单个插槽 默认插槽 2 具名插槽 3 作用域插槽因为父级模板里的所有内容都是在父级作用域中编译的 子级模板里的所有内容

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号