JVM的內(nèi)存中的堆(Heap)和棧(Stack)有什么區(qū)別
Stack是存放方法的局部變量的內(nèi)存空間,每個方法都會分配一塊空間Frame。方法一旦執(zhí)行完成,Frame被銷毀。Stack中的數(shù)據(jù)是共享的
對于原始類型(八個基本類型),變量的值也保存在Stack里面。
對于引用類型,Starck里面保存的是指向?qū)ο蟮膬?nèi)存地址(引用)。
而String比較特殊,當(dāng)形式為String a="a"時存放在棧中,而String a=new String("a"),是存放在堆中.
Heap堆存放Object
在JVM內(nèi)存中,線程是共享一個Heap的,而每個線程都有自己的棧。
java方法中的參數(shù)是傳值還是傳引用
Java 應(yīng)用程序有且僅有的一種參數(shù)傳遞機(jī)制,即按值傳遞
Java是傳值,那么傳遞的是值的副本;如果Java是傳引用,那么傳遞的是引用的副本。
對于基本類型變量(int、long、double、float、byte、boolean、char),Java是傳值的副本。(這里Java和C++相同)
對于一切對象型變量,Java都是傳引用的副本。其實傳引用副本的實質(zhì)就是復(fù)制指向地址的指針
String類型也是對象型變量,所以它必然是傳引用副本。不要因為String在Java里面非常易于使用,而且不需要new,就被蒙蔽而把String當(dāng)做基本變量類型。只不過String是一個非可變類,使得其傳值還是傳引用顯得沒什么區(qū)別。
類變量,實例變量,局部變量,塊變量的作用域分別是什么
- 類變量:作用在類上面
- 實例變量:只在一個實例中有效
- 局部變量:方法中聲明定義的變量或方法的參數(shù)被稱為局部變量
- 快變量:作用于塊內(nèi),在塊中定義使用例如for循環(huán)塊等
JVM如何回收內(nèi)存
Stack自動回收,Heap由GC自動回收.GC維護(hù)和檢測對象引用,引用書數(shù)0的對象可能會被回收,GC并不是實時回收內(nèi)存的,只有在適當(dāng)?shù)臅r候才會回收
System.gc():調(diào)用內(nèi)存回收,但不一定會和回收,只能說幾率比較大