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

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


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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 整型转字符串c语言_java字符串数组转字符串

    整型转字符串c语言_java字符串数组转字符串整型转字符串实现(C语言)second6020180529#include<stdio.h>//n<2的32次数,所以最大10位//n可能为负数,也可能为正数voidint2str(intn,char*str){charbuf[10]="";inti=0;intlen=0;//temp为n的绝…

    2022年10月19日
  • spring aop的实现_ssh框架工作原理及流程

    spring aop的实现_ssh框架工作原理及流程Spring的AOP实现原理,酝酿了一些日子,写博客之前信心不是很足,所以重新阅读了一边AOP的实现核心代码,而且又从网上找了一些SpringAop剖析的例子,但是发现挂羊头买狗肉的太多,标题高大上,内容却大部分都是比较浅显的一些介绍,可能也是由于比较少人阅读这部分的核心代码逻辑把,然后写这部分介绍的人估计也是少之又少,不过说实话,SpringAop的核心原理实现介绍确实不太好写,里面涉及的类

    2022年9月14日
  • AMM和ASMM理解

    AMM和ASMM理解oracle11g新出参数 MEMORY_MAX_TARGET和 MEMORY_TARGET进行自动管理PGA和SGA称之为自动化内存管理(AutomaticMemory Management,AMM)              MEMORY_MAX_TARGET :MEMORY_TARGET所能设定的最大值。非动态可调

    2022年6月7日
  • verilog变长移位寄存器「建议收藏」

    verilog变长移位寄存器「建议收藏」verilog变长移位寄存器普通的移位寄存器可以按如下设置,下面是一个一次移动一位的移位寄存器。moduleshift_stationary(clk,dat,ctrl,shift_out);inputclk;input[15:0]dat;input[1:0]ctrl;outputreg[15:0]shift_out;always@(posedgeclk)begincase(ctrl)2’b00:begin

    2022年7月16日
  • 静态IP地址版EVE模拟器部署和使用说明

    静态IP地址版EVE模拟器部署和使用说明很多小伙伴由于还是初学者,对DHCP等协议并不熟悉,因此在使用模拟器的时候出现各种不理解的问题。为了让大家顺利的开始学习之路,特分享一个静态IP地址版本的供大家选择。前面的部署步骤请参考我的另一篇博客:https://blog.51cto.com/dashu666/2177842虚拟机导入完成之后,在开机之前,需要做如下操作:1、将虚拟机桥接到一个虚拟网络中,如下图:这里的…

    2022年5月1日
  • Oracle修改system用户密码[通俗易懂]

    Oracle修改system用户密码[通俗易懂]服务器上oracle经常会使用plsqldeveloper访问,很多时候我们用的服务器,或者之前的密码我们并不知道,这个时候需要修改system的用户密码,当然也可以无用户登录,但是修改必然还是好些。下面讲讲方法,windows服务器,oracle11g。windows服务器:打开cmd运行命令 输入sqlplus/nolog—–实现无用户名登录       con…

    2022年7月28日

发表回复

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

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