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

运行时数据区——方法区

时间:2023-09-25 12:03:34浏览次数:34  
标签:Java E5% 方法 虚拟机 限定 线程 数据 运行


在Java虚拟机中, 关于被装载类的信息存储在一个逻辑上被称为方法区的内存中。 当虚拟机加载某个类型时,它使用类加载器定位相应的class文件,然后读入这个class文件——一个线性二进制数据流,然后将它传输到虚拟机中 ,紧接者虚拟机提取其中的类型信息, 并将这些信息存储到方法区。该类型中的类(静态)变量同样也是存储在方法区中。

由于所有线程都共享方法区, 因此它们对方法区数据的访问必须被设计为是线程安全的 。假设同时有两个线程都企图访问一个类, 而这个类还投有被装入虚拟机, 那么,这时只应该有一个线程去加载它,而另一个线程则只能等待。

方法区的大小不必是固定的, 虚拟机可以根据应用的需要动态调整。同样, 方法区也不必是連续的, 方法区可以在一个堆(甚至是虚担机自已的谁)中自由分配。 另外, 虚拟机也可以允许用户或者程序员指定方法区的初始大小以及最小和最大尺寸等 。

方法区也可以被垃圾收集, 因为虚拟机允许通过用户定又的类加载器来动态扩展Java程序, 因此一些类也会成为程序“不再引用”的类。当某个类变为不再被引用的类时, Java虚拟机可以卸裁这个类(垃圾收集),从而使方法区占据的内存保持最小。

运行时常量池

运行时常量池(RuntimeConstant Pool)是方法区的一部分。 Class文件中除了有类的版本、字段、方法、接口等描述等信息外。还有一项信息是常量池(ConstantPooI Tabte), 用于存放编译期生成的各种字面量和符号引用, 这部分内容将在类加载后存放到方法区的运行时常量池中 。

 

类型信息

类型信息

对每个装载的类, Java虚拟机都会在方法区中存储以下类型信息:

  • 这个类的全限定名
  • 这个类的直接超类的全限定名(除非这个类型是java.]ang.0t,ject,它没有超类)。
  • 这个类是类类型还是接口类型
  • 这个类的访问修饰符( public、 abstract或final的某个子集)。
  • 任何直接超接口的全限定名的有序列表

在Java class文件和虚拟机中, 类型名总是以全限定名出现。 在Java源代码中,全限定名由类所属包的名称加一个“.”,再加上类名组成。例如,类0bject的所属包为java.iang,那它的全限定名应该是java.lang.0bject,但在class文件里,所有的“.”都被斜杠 “/”代替,这样就成为java/lang/0bject。 至于全限定名在方法区中的表示, 则因不同的设计者有不同的选择而不同, 可以用任何形式和数据结构来代表。

 

 

参考:

http://www.hollischuang.com/archives/80

https://mritd.me/2016/03/22/Java-%E5%86%85%E5%AD%98%E4%B9%8B%E6%96%B9%E6%B3%95%E5%8C%BA%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E5%B8%B8%E9%87%8F%E6%B1%A0/

 

 

标签:Java,E5%,方法,虚拟机,限定,线程,数据,运行
From: https://blog.51cto.com/u_6947107/7594384

相关文章

  • java数据类型
    Java虚拟机中,数据装型及其运算都是由Java虚拟机规范严格定义的。数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位......
  • 运行时数据区——Java虚拟机栈
     与程序计数器一样,Java虚拟机栈(JavaVirtualMachineStacks)也是线程私有的,它的生命周期与线程相同。Java栈以帧为单位保存线程的运行状态。每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。虚拟机只会直接对Java栈执行两种操......
  • Mysql数据库定时备份到OSS
    背景mysql运行在Docker中,计划每天定时备份数据并存储到阿里云OSS。其中用到了定时任务crontab、云存储管理rclone、shell脚本部署脚本#创建目录mkdir-p~/taskcd~/task#创建主备份脚本touchbackup_main.sh#创建mysql备份脚本,这个后面要传到运行mysql的docker容器to......
  • React Hooks中父组件中调用子组件方法
    import {useState,useImperativeHandle,forwardRef}from 'react';//props子组件中需要接受reflet ChildComp=(props,ref)=>{    //此处注意useImperativeHandle方法的的第一个参数是目标元素的ref引用    useImperativeHandle(ref,()=>({      ......
  • 【Python】Main函数的使用方法
    Start在Python中,类(Class)本身没有main函数。但是,您可以在类中定义一个方法(例如main),然后在类的实例中调用该方法。在Python中,通常使用if__name__=="__main__":来检查当前模块是否作为主程序运行。如果是,则执行相应的代码。下面是一个简单的示例,说明如何在Python类中定义一个mai......
  • 异常检测:探索数据深层次背后的奥秘《下篇》
    异常检测:探索数据深层次背后的奥秘《下篇》异常检测——高维数据异常检测:孤立森林在实际场景中,很多数据集都是多维度的。随着维度的增加,数据空间的大小(体积)会以指数级别增长,使数据变得稀疏,这便是维度诅咒的难题。维度诅咒不止给异常检测带来了挑战,对距离的计算,聚类都带来了难题。......
  • mysql查询sum出来数据是decimal,转换成int
    mysql查询count数据是decimal,用python转换json格式的时候会报错,在查询的时候处理成无符号型,用cast查询出来countNum是DecimalSELECTgid,SUM(number)countNumFROM`gift_tb`WHEREtid="1"GROUPBYgid转换成无符号型SELECTgid,CAST(SUM(number)ASSIGNED)AScoun......
  • 钓鱼文件应急溯源:方法篇
    内容概览背景恶意软件分析技术的市场如今,恶意软件分析已是信息安全领域的一个整体产业:发布保护产品的反病毒引擎实验室,高度专业化的专家小组,甚至恶意软件编写者本身也参与其中,他们争夺一个潜在的客户--"受害者"。常见的分析技术静态恶意软件分析静态恶意软件分析在不主......
  • python去除某列固定数字对应的整行方法
     想去除month列里的1,2,3,4,10,11,12月对应的行留下5,6,7,8,9月#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Su@file:deletestaion.py@time:2023/09/22@desc:"""importpandasaspddf=pd.read_excel('/lianxi/SPI.xlsx�......
  • 异常检测:探索数据深层次背后的奥秘《下篇》
    异常检测:探索数据深层次背后的奥秘《下篇》异常检测——高维数据异常检测:孤立森林在实际场景中,很多数据集都是多维度的。随着维度的增加,数据空间的大小(体积)会以指数级别增长,使数据变得稀疏,这便是维度诅咒的难题。维度诅咒不止给异常检测带来了挑战,对距离的计算,聚类都带来了难题......