当前位置:网站首页>Class constant pool and runtime constant pool
Class constant pool and runtime constant pool
2022-07-07 03:58:00 【The season when the monsoon dies】
class Constant pool
java The file is being compiled into class After the document , stay class A constant pool will be generated in the file , The literal amount used to store code 、 Symbol reference , Such as static、void、public wait . This constant pool is called class Constant pool . use javap The command generates a readable JVM Bytecode instruction file :
javap -v ScheduledBlockChainTask.class
The red box indicates class Constant pool information , There are two main types of constants in the constant pool : Literal and symbolic references .
int a = 1;
int b = 2;
int c = "abcdefg";
int d = "abcdefg
- Fully qualified names of classes and interfaces
- Name and descriptor of the field
- The name and descriptor of the method
- Create a string constant pool for Strings , Similar to the cache
- When creating a string constant , First, query whether the string constant pool exists
- The string exists , Return reference instance , non-existent , Instantiate the string and put it in the pool
- Jdk1.6 And before : There is a permanent generation , The runtime constant pool is in the permanent generation , Runtime constant pool contains string constant pool
- Jdk1.7: There is a permanent generation , But gradually “ To the eternal generation ”, The string constant pool is separated from the runtime constant pool in the permanent generation into the heap
- Jdk1.8 And after : There is no permanent generation , Runtime constant pool in meta space , The string constant pool is still in the heap
Three string operations
- Assign strings directly
String s = "lamu"; // s Point to references in the constant pool
- new String();
String s1 = new String("zhuge"); // s1 Point to an object reference in memory
- intern Method
String s1 = new String("zhuge");
String s2 = s1.intern();
System.out.println(s1 == s2); //false
intern Method returns the reference of the object in the string constant pool . stay jdk6 And below , If the object exists in the string constant pool , Returns the reference of the object in the string constant pool . without , Then add the object to the string constant pool , Returns the reference of this object in the string constant pool . stay jdk6 In the previous version , If the object exists in the string constant pool , Returns the reference of the object in the string constant pool . without , Then check whether the object exists in the heap , If there is , Put the reference of this object in the heap into the string constant pool and return .
String Splicer “+” What will the bottom do
If at compile time , It can determine the value of objects before and after splicing , Then it will be spliced directly in the compilation stage , Put the final value into the string constant pool . If you can't know the value of the object before and after splicing at the compilation stage , Then an object will be created in the heap and string constant pool by splicing the front and rear field values at run time .
String s1 = new String("he") + new String("llo");
String s2 = s1.intern();
System.out.println(s1 == s2);
// stay JDK 1.6 Lower output yes false, Created 6 Objects
// stay JDK 1.7 And above version output is true, Created 5 Objects
// Of course, we didn't consider GC, But these objects do exist or exist
// Be careful : Whether the constant pool has a corresponding object depends on the literal , Objects with non-existent literals will not appear in the constant pool
String s0="hello";
String s1="hello";
String s2="he" + "llo";
System.out.println( s0==s1 ); //true
System.out.println( s0==s2 ); //true s2 It will be optimized to "hello".
String s0="hello";
String s1=new String("hello");
String s2="he" + new String("llo");
System.out.println( s0==s1 ); // false s0 In the constant pool ,s1 In the heap
System.out.println( s0==s2 ); // false new String("llo") Cannot optimize at compile time , therefore s2 Finally, it is generated in the heap
System.out.println( s1==s2 ); // false s1 and s2 It's all in the pile , But they are new Two different objects come out
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println(a == b); // false Variable bb Unknown at compile time , Can't optimize
String a = "ab";
final String bb = "b";
String b = "a" + bb;
System.out.println(a == b); // true bb use final modification , The compile time is known ,b It can be optimized to "ab"
String a = "ab";
final String bb = getBB();
String b = "a" + bb;
System.out.println(a == b); // false Method is used final modification , It also needs to generate dynamic link execution code at runtime , Therefore, the compilation time is unknown , Can't optimize
private static String getBB() {
return "b";
}
String str2 = new StringBuilder(" Computer ").append(" technology ").toString();
System.out.println(str2 == str2.intern()); //true
// str2 Equal to the objects in the heap " Computer technology ", Because there is no literal " Computer technology ", So this object does not exist in the constant pool .
// str2.intern() The reference to the heap object in the returned string constant pool , So it's the same object
String str1 = new StringBuilder("ja").append("va").toString();
System.out.println(str1 == str1.intern()); //false
// java Is the key word , stay JVM The initialized related classes are put into the string constant pool .
String s1=new String("test");
System.out.println(s1==s1.intern()); //false
// new The object that comes out already exists in the constant pool ,s1.intern() Returns an object from a constant pool .
//5 Plastic packaging Byte,Short,Integer,Long,Character The object of ,
// When the value is less than 127 You can use the object pool
Integer i1 = 127; // The underlying layer of this call is actually executed Integer.valueOf(127), It uses IntegerCache Object pool
Integer i2 = 127;
System.out.println(i1 == i2);// Output true
// Greater than 127 when , No objects are taken from the object pool
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);// Output false
// use new Keywords newly generated objects do not use object pools
Integer i5 = new Integer(127);
Integer i6 = new Integer(127);
Integer i7 = 127;
System.out.println(i5 == i6);// Output false
System.out.println(i5 == i7);// Output false
//Boolean Class also implements object pooling Technology
Boolean bool1 = true;
Boolean bool2 = true;
System.out.println(bool1 == bool2);// Output true
// Floating point wrapper classes don't implement object pooling
Double d1 = 1.0;
Double d2 = 1.0;
System.out.println(d1 == d2);// Output false
边栏推荐
猜你喜欢
数据的存储
VHDL implementation of arbitrary size matrix addition operation
Confirm the future development route! Digital economy, digital transformation, data This meeting is very important
Calculation of time and space complexity (notes of runners)
Antd Comment 递归循环评论
10 ways of interface data security assurance
Machine learning notes - bird species classification using machine learning
Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
[MySQL] row sorting in MySQL
Top 50 hit industry in the first half of 2022
随机推荐
Gpt-3 is a peer review online when it has been submitted for its own research
It's too convenient. You can complete the code release and approval by nailing it!
数据的存储
How to detect whether the MySQL code runs deadlock +binlog view
What is Ba? How about Ba? What is the relationship between Ba and Bi?
概率论公式
Construction of Hisilicon universal platform: color space conversion YUV2RGB
R data analysis: how to predict Cox model and reproduce high score articles
运算放大器应用汇总1
Que savez - vous de la sérialisation et de l'anti - séquence?
使用 TiDB Lightning 恢复 GCS 上的备份数据
termux设置电脑连接手机。(敲打命令贼快),手机termux端口8022
QT thread and other 01 concepts
The true face of function pointer in single chip microcomputer and the operation of callback function
QT 打开文件 使用 QFileDialog 获取文件名称、内容等
HW-小记(二)
.net中 接口可以有默认实现了
The most complete learning rate adjustment strategy in history LR_ scheduler
[dpdk] dpdk sample source code analysis III: dpdk-l3fwd_ 001
One of oscp tools: dirsearch usage Encyclopedia