课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
运行时常量池是java程序员在学习java虚拟机技术的时候需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,java虚拟机运行时常量池的作用。
1.符号引用
一个java类(假设为People类)被编译成一个class文件时,如果People类引用了Tool类,但是在编译时People类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。
而在类装载器装载People类时,此时可以通过虚拟机获取Tool类的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址。
即在编译时用符号引用来代替引用类,在加载时再通过虚拟机获取该引用类的实际地址。
以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局是无关的,引用的目标不一定已经加载到内存中。
2.字面量
文本字符串Stringa="abc",这个abc就是字面量。
八种基本类型inta=1;这个1就是字面量。
声明为final的常量。
3.jvm各版本运行时常量池变化
运行时常量池:Class文件中的常量池(编译器生成的各种字面量和符号引用)会在类加载后被放入这个区域。
JDK1.6:运行时常量池在方法区(永久代)中。
JDK1.7:运行时常量池在堆中。
JDK1.8:去永久代:使用元空间(空间大小只受制于机器的内存)替代永久代。
4.直接内存
内存对象分配在JVM中堆以外的内存,也可以称为直接内存,这些内存直接受操作系统管理(而不是JVM),这样做的好处是能够在一定程度上减少垃圾回收对应用程序造成的影响。
使用Native函数库直接分配堆外内存(NIO)。
并不是JVM运行时数据区域的一部分,但是会被频繁使用(可以通过-XX:MaxDirectMemorySize来设置(默认与堆内存大值一样,也会出现OOM异常)。
避免了在Java堆和Native堆中来回复制数据,能够提高效率。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。