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堆或运行时常量池。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java 中是如何获取 IP 属地的[通俗易懂]

    Java 中是如何获取 IP 属地的[通俗易懂]细心的小伙伴可能会发现,抖音新上线了IP属地的功能,小伙伴在发表动态、发表评论以及聊天的时候,都会显示自己的IP属地信息这里有三个名词,分别是X-Forwarded-For:一个HTTP扩展头部,主要是为了让Web服务器获取访问用户的真实IP地址。每个IP地址,每个值通过逗号+空格分开,最左边是最原始客户端的IP地址,中间如果有多层代理,每⼀层代理会将连接它的客户端IP追加在X-Forwarded-For右边。X-Real-IP:一般只记录真实发出请求的客户端IP

    2022年10月21日
  • TypeScript(5)类、继承、多态「建议收藏」

    TypeScript(5)类、继承、多态「建议收藏」前言对于传统的JavaScript程序我们会使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员使用这些语法就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来

  • 如何进行大数据处理?大数据处理的方法步骤[通俗易懂]

    如何进行大数据处理?大数据处理的方法步骤[通俗易懂]1.大数据处理之一:采集大数据的采集是指利用多个数据库来接收发自客户端(Web、App或者传感器形式等)的数据,并且用户可以通过这些数据库来进行简单的查询和处理工作。比如,电商会使用传统的关系型数据库MySQL和Oracle等来存储每一笔事务数据,除此之外,Redis和MongoDB这样的NoSQL数据库也常用于数据的采集。在大数据的采集过程中,其主要特点和挑战是并发数高,因为同时有…

  • C#之线程ParameterizedThreadStart[通俗易懂]

    C#之线程ParameterizedThreadStart[通俗易懂]ParameterizedThreadStartclassProgram{staticvoidMain(string[]args){Workwork=newWork();//两种实例化委托的方法;//ParameterizedThreadStartParameterizedThreadStartDelegate=newParam…

  • 视频采用的压缩编码_视频压缩编码存在的冗余信息

    视频采用的压缩编码_视频压缩编码存在的冗余信息1、什么是H.261编码协议        答:H.261是最早出现的视频编码建议,它采用的算法结合了可减少时间冗余的帧间预测和可减少空间冗余的DCT变换的混合编码方法,其输出码率是p×64kbit/s。p取值较小时,只能传清晰度不太高的图像,适合于面对面的电视电话;p取值较大时(如p>6),可以传输清晰度较好的会议电视图像。该标准主要针对ISDN电话线的视频会议,可视电话等,ISDN的

    2022年10月30日
  • from django.db import models_独立团模块源码

    from django.db import models_独立团模块源码前言APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块请求模块:request对象源码入口APIView类中di

发表回复

您的电子邮箱地址不会被公开。

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