JVM內(nèi)存模型

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)存回收,但不一定會和回收,只能說幾率比較大

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容