起航学习网

- 让每个人都能学到最前沿新知识、新技能!
起航学习网
当前位置: 起航学习网 > 短期培训 > 编程语言 > java方法区是什么 Java方法区存的是什么样的东西

java方法区是什么 Java方法区存的是什么样的东西

时间:2019-10-25 17:36:35来源:编程网 作者:IT培训网 已有: 名学员访问该课程

  快捷搜索:java语言java开发Java培训

前言:方法区存着类的信息,常量和静态变量,即类被编译后的数据。这个说法其实是没问题的,只是太笼统了。更加详细一点的说法是方法区里存放着类的版本,字段,方法,接口和常量池。常量池里存储着字面量和符号引用。

java方法区是什么,怎么样学习java方法区?java方法区存的是什么样的,方法区在堆中吗?

Java方法区存的是什么?方法区在堆中吗?最近一直被方法区里面存着什么东西困扰着,为了解开这个谜题,我查阅了大量资料,总算是解开了心里的那把锁,下面就将java方法区这一概念细数一下。

Java方法区存的是什么样的东西?

1.方法区里存class文件信息和class文件常量池是个什么关系。

2.class文件常量池和运行时常量池是什么关系。

方法区存着类的信息,常量和静态变量,即类被编译后的数据。这个说法其实是没问题的,只是太笼统了。更加详细一点的说法是方法区里存放着类的版本,字段,方法,接口和常量池。常量池里存储着字面量和符号引用。

符号引用包括:1.类的全限定名,2.字段名和属性,3.方法名和属性。

下面一张图是我画的方法区,class文件信息,class文件常量池和运行时常量池的关系

java方法区是什么 Java方法区存的是什么样的东西_www.epx365.cn

下面一张图用来表示方法区class文件信息包括哪些内容:

java方法区是什么 Java方法区存的是什么样的东西_www.epx365.cn

可以看到在方法区里的class文件信息包括:魔数,版本号,常量池,类,父类和接口数组,字段,方法等信息,其实类里面又包括字段和方法的信息。

下面的图表是class文件中存储的数据类型

类型名称数量

u4magic1

u2minor_version1

u2major_version1

u2constant_pool_count1

cp_infoconstant_poolconstant_pool_count - 1

u2access_flags1

u2this_class1

u2super_class1

u2interfaces_count1

u2interfacesinterfaces_count

u2fields_count1

field_infofieldsfields_count

u2methods_count1

method_infomethodsmethods_count

u2attribute_count1

attribute_infoattributesattributes_count

下面用一张图来表示常量池里存储的内容:

java方法区是什么 Java方法区存的是什么样的东西_www.epx365.cn

用一个class文件实际反编译一下

下面是原java代码

java方法区是什么 Java方法区存的是什么样的东西_www.epx365.cn

经过反编译后获得class文件是下面这样的

java方法区是什么 Java方法区存的是什么样的东西_www.epx365.cn

可以看出被反编译的class文件中的内容和上面所说的是能对应上的。这就解答了class文件和静态常量池(class文件常量池)的关系

静态常量池和动态常量池的关系以及区别

静态常量池存储的是当class文件被java虚拟机加载进来后存放在方法区的一些字面量和符号引用,字面量包括字符串,基本类型的常量,符号引用其实引用的就是常量池里面的字符串,但符号引用不是直接存储字符串,而是存储字符串在常量池里的索引。

动态常量池是当class文件被加载完成后,java虚拟机会将静态常量池里的内容转移到动态常量池里,在静态常量池的符号引用有一部分是会被转变为直接引用的,比如说类的静态方法或私有方法,实例构造方法,父类方法,这是因为这些方法不能被重写其他版本,所以能在加载的时候就可以将符号引用转变为直接引用,而其他的一些方法是在这个方法被第一次调用的时候才会将符号引用转变为直接引用的。

方法区在堆中吗?

方法区里存储着class文件的信息和动态常量池,class文件的信息包括类信息和静态常量池。可以将类的信息是对class文件内容的一个框架,里面具体的内容通过常量池来存储。

动态常量池里的内容除了是静态常量池里的内容外,还将静态常量池里的符号引用转变为直接引用,而且动态常量池里的内容是能动态添加的。例如调用String的intern方法就能将string的值添加到String常量池中,这里String常量池是包含在动态常量池里的,但在jdk1.8后,将String常量池放到了堆中。

文章出自:http://qh.itpxw.cn/peixun/software/201957086.html

文章标题:java方法区是什么 Java方法区存的是什么样的东西



免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉

你也许会喜欢如下的文章?
(责任编辑:IT培训网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
培训学校
IT培训网 访问该机构站点 报名留言 加为好友 用户等级:注册会员 用户级别:10 机构名称:IT培训网 联 系 人:罗老师 联系电话:13783581536 联系手机:13783581536 在线客服:起航学习网客服 在 线 QQ:起航学习网客服 电子邮件: 网站域名:http://www.itpxw.cn 注册时间:2016-07-18 11:07 最后登录:2024-02-20 13:02
推荐内容