- final修饰的引用只是代表这个引用的引用对象不可更改。并不代表内存位置,仍然会被存储在栈和堆中(所以内存泄漏和这个修饰符无关)。内存泄漏的几种境况:
Ⅰ. static : 存储位置方法区(类加载过程)
Ⅱ. 局部变量:存储在栈中(线程和栈是一对一的,但是线程的运行时间具有不可控性)
Ⅲ. 成员变量:存储在堆中 (生命周期长的对象引用生命周期短的对象) - JVM中的常量池,只是存储 字面量和符号引用
- 字面量
int i = 1; //把整数1赋值给int型变量i,整数1就是Java字面量, String s = "abc"; //中的abc也是字面量。
- 符号引用
符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(假设是这个,当然实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
网友评论