string在堆還是棧?
java的字符串存儲(chǔ)在哪?
對(duì)于堆、棧和字符串常量池以及他們之間的關(guān)系,我是這樣理解的。
首先介紹一下堆、棧、常量池中存放的數(shù)據(jù)類型吧。
JAVA的JVM的內(nèi)存可分為3個(gè)區(qū):堆(heap)、棧(stack)和方法區(qū)(method)
堆:存放所有new出來的對(duì)象,存儲(chǔ)的全部是對(duì)象,每個(gè)對(duì)象都包含一個(gè)與之對(duì)應(yīng)的class的信息。(class的目的是得到操作指令)棧:存放基本數(shù)據(jù)變量和對(duì)象的引用,對(duì)象(new出來的對(duì)象)本身不存在在棧中,而是存放在堆中或者常量池中(字符串對(duì)象存放在常量池中);
常量池:存放基本類型常量和字符串常量。
每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基礎(chǔ)數(shù)據(jù)類型的對(duì)象和自定義對(duì)象的引用(不是對(duì)象),對(duì)象都存放在堆區(qū)中 。棧中的數(shù)據(jù)大小和生命周期是可以確定的,當(dāng)沒有引用指向數(shù)據(jù)時(shí),數(shù)據(jù)就會(huì)自動(dòng)消失。堆中的對(duì)象由垃圾回收器負(fù)責(zé)回收,因此大小和生命周期不需要確定,具有很大的靈活性。
每個(gè)棧中的數(shù)據(jù)(原始類型和對(duì)象引用)都是 私有的,其他棧不能訪問。
24.3.棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。