天天看点

运行时常量池、静态常量池——辨析

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

运行时常量池、静态常量池——辨析

静态常量池存储的是当class文件被java虚拟机加载进来后存放在方法区的一些字面量和符号引用,如下:

运行时常量池、静态常量池——辨析

字面量, 符号引用与直接引用 的辨析 参考 这篇文章

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

总结:

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

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

该篇文章借鉴参考 https://blog.csdn.net/wangbiao007/article/details/78545189

https://blog.csdn.net/u013412772/article/details/81051465