当前位置:网站首页>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
边栏推荐
- [safe office and productivity application] Shanghai daoning provides you with onlyoffice download, trial and tutorial
- QT opens a file and uses QFileDialog to obtain the file name, content, etc
- 10 ways of interface data security assurance
- VHDL implementation of single cycle CPU design
- 25. (ArcGIS API for JS) ArcGIS API for JS line modification line editing (sketchviewmodel)
- Redis源码学习(30),字典学习,dict.h
- 自适应非欧表征广告检索系统AMCAD
- PIP download only, not install
- Implementation of binary search tree
- Huawei and Xiaomi "copy each other"
猜你喜欢
Force buckle ----- path sum III
Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
codeforces每日5题(均1700)-第七天
23. (ArcGIS API for JS) ArcGIS API for JS ellipse collection (sketchviewmodel)
【mysql】mysql中行排序
AVL树插入操作与验证操作的简单实现
[development software] tilipa Developer Software
1.19.11.SQL客户端、启动SQL客户端、执行SQL查询、环境配置文件、重启策略、自定义函数(User-defined Functions)、构造函数参数
Ubuntu 20 installation des enregistrements redisjson
Que savez - vous de la sérialisation et de l'anti - séquence?
随机推荐
MySQL storage engine
VHDL implementation of arbitrary size matrix addition operation
Can the applet run in its own app and realize live broadcast and connection?
R data analysis: how to predict Cox model and reproduce high score articles
qt-线程等01概念
21. (article ArcGIS API for JS) ArcGIS API for JS rectangular acquisition (sketchviewmodel)
[leetcode] 450 and 98 (deletion and verification of binary search tree)
HW notes (II)
2022年上半年HIT行业TOP50
Force buckle ----- path sum III
Set WiFi automatic connection for raspberry pie
Baidu map JS development, open a blank, bmapgl is not defined, err_ FILE_ NOT_ FOUND
C task expansion method
web服务性能监控方案
如何检测mysql代码运行是否出现死锁+binlog查看
What is Ba? How about Ba? What is the relationship between Ba and Bi?
What is the experience of maintaining Wanxing open source vector database
史上最全学习率调整策略lr_scheduler
Adaptive non European advertising retrieval system amcad
Antd Comment 递归循环评论