之前写的确实写的有问题,我都没想到会被这么多人赞,为了不误人子弟,我重新写一写这个题,用到的知识点:
为了避免歧义,以下提及的JVM,是Hotspot
方法区是什么?
方法区是广义上的概念,是一个定义、标准,可以理解为Java中的接口,在Jdk6、7方法区的实现叫永久代;Jdk8之后方法区的实现叫元空间,并从JVM内存中移除,放到了直接内存中;
方法区是被所有方法线程共享的一块内存区域.
运行时常量池是什么?
运行时常量池是每一个类或接口的常量池的运行时表示形式.
具体体现就是在Java编译后生成的.class文件中,会有class常量池,也就是静态的运行时常量池;
运行时常量池存放的位置?
在不同版本的JDK中,运行时常量池所处的位置也不一样.
JDK1.7及之前方法区位于永久代.由于一些原因在JDK1.8之后彻底祛除了永久代,用元空间代替.所以运行时常量池一直是方法区的一部分。
运行时常量池存放什么?
存放编译期生成的各种字面量和符号引用;(字面量和符号引用不懂的同学请自行查阅)
运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用。 此时不再是常量池中的符号地址了,这里换为真实地址。
运行时常量池与字符串常量池?(可能有同学把他俩搞混)
字符串常量池:在JVM中,为了减少相同的字符串的重复创建,为了达到节省内存的目的。会单独开辟一块内存,用于保存字符串常量,这个内存区域被叫做字符串常量池.
字符串常量池位置?
JDK1.6时字符串常量池,被存放在方法区中(永久代),而到了JDK1.7,因为永久代垃圾回收频率低;而字符串使用频率比较高,不能及时回收字符串,会导致导致永久代内存不足,就被移动到了堆内存中。