之前寫過一篇關於JVM內存區域劃分的文章,但是昨天接到螞蟻金服的面試,問到JVM相關的內容,解釋一下JVM的內存區域劃分,這部分答得還不錯,但是後來又問了Java裡面String存放的位置,之前只記得String是一個不變的量,應該是要存放在常量池裡面的,但是後來問到new一個String出來應該是放到哪裡的,這個應該是放到堆裡面的,後來又問到String的引用是放在什麼地方的,當時傻逼的說也是放在堆裡面的,現在總結一下:基本類型的變量數據和對象的引用都是放在棧裡面的,對象本身放在堆裡面,顯式的String常量放在常量池,String對象放在堆中。
常量池之前是放在方法區裡面的,也就是在永久代裡面的,從JDK7開始移到了堆裡面。這一改變我們可以從Oracle的release version的notes裡的** Important RFEs Addressed in JDK 7 **看到。
Area: HotSpot
Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.
RFE: 6962931
顯式的String常量
String a = "holten";
String b = "holten";
String對象
String a = new String("holtenObj");
String b = new String("holtenObj");
/** * Created by holten.gao on 2016/8/16. */
public class Main {
publicstaticvoidmain(String[] args){
String str1 = "高小天";
String str2 = "高小天";
System.out.println(str1==str2);//true
String str3 = new String("高大天");
String str4 = new String("高大天");
System.out.println(str3==str4);//false
}
}
返回結果:
true
false