- jvm 1.6 类,类加载器和常量池用堆内存中的永久代实现
- 到了jvm 1.8 ,类,加载器和常量池被放入了元空间,元空间占用操作系统内存而不是堆内存
- cglib
- 常量池是储存指令的常量表,根据指令编号在常量池中查找,跳转指令
- 运行时常量池就是将指令编号加载到运行内存中
- 串池(stringtable),例如,string xx = “a”,a首先为常量池中的符号,还没有变成字符串对象,通过string指令后,会首先在stringtable中寻找是否有“a”,没有就声明这一对象并加载进入stringtable。string声明这一特性为懒惰性
//example
String s1 = "a";
String s2 = "b";
String s3 = "ab";
String s4 = s1+s2;
String s5 = "a"+"b";
//(s3==s4)? // false
//(s3==s5)? // true
// 首先==判断的是地址是否相同,s3声明后在串池中
// s4首先初始化一个stringbuilder对象,
// 再依次调用append,append,tostring方法,
//最后生成“ab”,因此两者的地址不同
// 对s5,java在编译期间优化,两个常量拼接结果不会变动了,一定是个常量,直接声明在串池中