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

方法区和常量池_字符串常量池在堆中还是方法区最近一直被方法区里面存着什么东西困扰着?    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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DEDECMS点击主栏目默认显示第一个子栏目列表的方法

    DEDECMS点击主栏目默认显示第一个子栏目列表的方法

    2021年9月24日
    39
  • 智能手机Symbian操作系统入门知识整理

    智能手机Symbian操作系统入门知识整理1.什么是S60。    什么是OS6/7/8/9,什么是J2ME。    什么是MIDP根据人机界面的不同Symbian操作系统分为S60、S80、S90和UIQ,发展不同用户界面的目的是为了让手机厂商有更多的选择以投入Symbian手机的开发。S60用户界面(UI)专门为简便、单手使用而设计。S60平台提供了基于SymbianC的。    开放的。    标准的开

    2022年7月11日
    20
  • 大数据在农业应用_让脸变干净的小妙招

    大数据在农业应用_让脸变干净的小妙招民以食为天。互联网与农业深度融合,推动农业大数据发展。在互联网时代,通过大数据分析,让智慧农业发展更迅速。搭乘智慧农业快车,今后农业种地将不再是脏累差的工作,而会变得越来越简单、舒服,收益也会不断提高,体面高端的“新农人”职业一定会受到追捧。掘金农业大数据当前,“互联网+”已经上升为国家战略,成为发展的新增长点,是中央和地方政策扶持的重点,也是投资的焦点。在推进大众创业、万众创新中,“互联网+”呈…

    2022年10月5日
    2
  • 无线视频传输技术「建议收藏」

    无线视频传输技术「建议收藏」原文地址:http://www.ed-china.com/ART_8800047847_400002_500018_HN_151edec4.HTMWiDi/Miracast将在无线高清视频传输市场占最大份额据IHSiSuppli公司的显示电子特别报告,在消费与移动产品高清视频无线传输市场,三种基于Wi-Fi的视频技术将胜过两种应用范围较窄的专有技术。今年能传输高清视频

    2022年9月26日
    3
  • 记一次在Eclipse中用Axis生成webservice服务端的过程中出现的问题

    记一次在Eclipse中用Axis生成webservice服务端的过程中出现的问题

    2021年9月14日
    49
  • jsonobject string转json_java jsonobject转string

    jsonobject string转json_java jsonobject转string你需要把字符串利用一些字符串函数得到=》{“name”:”小明”,”pwd”:”123″}再转就可以了。比如:entity({“name”:”小明”,”pwd”:”123″})这种就转化不了,会报错。这里的String是有些要求的,首先它要是json格式,其次json格式中不能出现其他的字符。这里的JSONObject对像是不是hutool这些工具类的哦,是java内部自带这个。代码是我手敲的可能会出错。很简单JSONObject有toSting方法直值调用就好。…

    2022年8月23日
    11

发表回复

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

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