运行时数据区——方法区
在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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Java虚拟机的简介
Java虚拟机的生命周期 一个运行时的Java虚拟机负责运行一个Java程序 。Java虚拟机的主要任务是加载class文件并且执行其中的字节码。Java 虚拟机包含一个类装载器(class loader)。它可以从程序和API中加载class文件。 Java API中只有程序执行时需要的部些类才会被装载 。 当启动一个Java程序时,一个虚拟机实例也就诞生了. 当该程序关闭退出, 这个虚拟机实例也就随之消亡 。 如果在同一 台计算机上同时运行三个Java程序, 将得到三个Java虚拟机实例。 每个lava程序都运行于它自已的Java虚拟机实例中 。 Java虚拟机实例通过调用某个初始类的main( )方法运行一个Java程序。而这个main( ) 方法必须是公有的(public)、静态的(static),通回值为void,井且接受一个字符中数组作为参数。住何拥有这样一个main( )方法的类都可以作为Java程序运行的起点。 虚拟机体系结构 在Java虚拟机规范中, 一个虚拟机实例的行为是分别按照子系统、 内存区、 数据类型以及指令这几个术语来描述的。 这些组成部分一起展示了抽象的虚...
-
下一篇
openfire 插件开发
插件分类 消息等内部插件 这类插件主要用于对 openfire 内消息,状态等扩展 webUI 插件 这类插件主要用于对 openfire 控制台扩展 web接口插件 这类插件主要用于对 openfire 后台接口扩展 插件开发基本流程 实现 Plugin 类 添加 plugin.xml 配置插件启动类 添加 changelog.html, logo_*.png/gif, readme.html 等说明文件及logo 基本的目录结构如下图: 插件目录结构 通常 plugin.xml 是导入 PluginManager 中的默认配置文件,其配置如下所示: <?xml version="1.0" encoding="UTF-8"?> <plugin> <class>com.demo.hello.HelloPlugin</class> <name>hello</name> <description>First Openfire Custom Plugin.</description> <au...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- MySQL数据库在高并发下的优化方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19