方法区和常量池_字符串常量池在堆中还是方法区

方法区和常量池_字符串常量池在堆中还是方法区最近一直被方法区里面存着什么东西困扰着?    1.方法区里存class文件信息和class文件常量池是个什么关系。    2.class文件常量池和运行时常量池是什么关系。         方法区存着类的信息,常量和静态变量,即类被编译后的数据。这个说法其实是没问题的,只是太笼统了。更加详细一点的说法是方法区里存放着类的版本,字段,方法,接口和常量池。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

        最近一直被方法区里面存着什么东西困扰着?

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

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

        

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

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

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

       方法区和常量池_字符串常量池在堆中还是方法区

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

       方法区和常量池_字符串常量池在堆中还是方法区

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

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

类型 名称 数量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count – 1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attribute_count 1
attribute_info attributes attributes_count

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

        这里写图片描述

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

下面是原java代码

public class TestInt {  
    private String str = "hello";  
    void printInt(){  
        System.out.println(65535);  
    }  
} 

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

方法区和常量池_字符串常量池在堆中还是方法区

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

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

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

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

总结:

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

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

下面有一篇文章写的是比较好的

http://blog.csdn.net/vegetable_bird_001/article/details/51278339

https://www.cnblogs.com/holos/p/6603379.html

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android布局属性具体解释[通俗易懂]

    android布局属性具体解释

    2022年1月31日
    43
  • WORD域代码详解[通俗易懂]

    WORD域代码详解[通俗易懂]来自:百度文库WORD域代码详解我们在word中编辑文档时,有时会经常遇到要求输入数学公式的情况。虽然简单的加、减、乘、除等运算都可在键盘上直接输入,但遇到复杂的数学公式:如积分、开方、求和等符号时,就只能利微软的office套件中所带的工具”公式编辑器”来完成,但是在office套件的典型安装的过程中,并没有选择这个工具,那么有没有办法可以在word中直接输入这些符号呢?答案是肯定的,下

    2022年6月14日
    38
  • 服务器中心地址,互联网时间同步服务器地址(国家授时中心服务器)[通俗易懂]

    服务器中心地址,互联网时间同步服务器地址(国家授时中心服务器)[通俗易懂]中新创科技研制开发的DNTS,Windowstime服务用于和Internet同步系统时间。xp自带的时间同步服务器老是会连不上,这里就教大家换成中科院国家授时中心的服务器。中国国家授时中心的时间服务器IP地址及时间同步方法大家都知道win7旗。用来同步电脑的时间的服务器、DNTS。为更好的满足用户的需求。网络授时服务器的域名为ntp。同步就方便多了,然后键入w32tmregister正确的响应为…

    2022年7月16日
    14
  • UML图之例图

    用例图主要说明的是谁要使用系统,以及他们使用该系统可以做些什么,帮助开发团队以一种可视化的方式理解系统的功能需求。一个用例图包含了多个模型元素,如系统、参与者和用例,并且显示这些元素之间的各种关系,

    2021年12月29日
    40
  • cshtml 界面的传值(传到不同的界面)

    cshtml 界面的传值(传到不同的界面)在MVC模式中新建了一个文件夹Test   提交表单写在Index.cshtml 文件夹里面。代码如下:     用户名:    密码:    提交     其中action=”Message” 负责跳转到同级目录的文件。然后就是控制器的代码:因为我要跳转的界面是 Message.cshtml ,所以在控制

    2022年6月26日
    68
  • 深入浅出Java垃圾回收机制

    深入浅出Java垃圾回收机制

    2022年3月13日
    40

发表回复

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

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