java調優隨記-堆和棧

基礎知識:java

關於堆和棧,堆和棧是程序運行的關鍵,關於堆和棧的定義和解釋可自行搜索,我比較承認以程序運行過程當中他們扮演的角色做爲對比的點:堆是存儲的單位,而棧是程序運行時的單位。棧解決的是程序的運行問題,即程序如何運行,如何處理數據。堆解決的是存儲問題,即數據存儲在哪裏,怎麼存儲。線程

程序中每啓動一個線程就有一個棧與之對應。由於每一個線程執行的邏輯不一樣,因此須要獨立的棧來描線程如何運行。而堆是全部線程共享的。設計

棧之因此是運行時單位,主要是由於棧中保存的都是當前線程中,包括局部變量,程序運行狀態和方法返回值。而堆用來存儲對象信息。指針

堆和棧的關係:對象

1.從軟件設計的角度看,棧表明了處理邏輯,堆表明了數據。這樣分開使得處理邏輯更加清晰。分而治之的思想體現。部署

2.棧與堆的分離,使堆中的數據被多個棧共享。棧的存取速度至關快,僅次於cpu中的寄存器,可是棧的大小是有限制的,不可能過多地存儲數據,堆的出現則解決了這個問題,堆中的數據能夠被多個棧共享,節約了棧的空間。另外也爲數據的交換提供了一種方案。基礎

3.棧是運行時單位,也就是隨着程序運行,程序進行系統上下文切換時都須要對地址段進行劃分,因爲棧是向上增加的,就會限制棧存儲內容的能力。而堆能夠動態增加,棧只要記錄一下堆中的地址。變量

4.面向對象就是堆和棧的優點互補。面向對象程序和結構化程序的運行基本是同樣,只是面向對象的思考方式更接近天然思考的方式。好比java中的一個類的對象,對象的屬性就是數據,對象的方法就是邏輯。屬性保存在堆裏,而方法保存在棧中。軟件

堆中存儲對象,棧中存儲的是基本數據類型和對象引用。搜索

 

java中傳遞參數究竟是值傳遞仍是引用傳遞呢?

java中沒有指針的概念,程序永遠是在棧中運行的,所以在參數傳遞的時候,只能是值傳遞,即傳遞基本數據類型和對象引用,不會直接傳遞對象。

基本數據類型的傳遞和對象引用的傳遞都是傳值。

 

堆和棧中,棧是程序運行的最根本的東西。程序能夠沒有堆,可是不能沒有棧。堆是爲棧服務的,堆裏存儲的數據,就是用來被全部的棧共享的。

在java中,能夠經過-Xss來設置棧的大小。若是棧中存儲的數據過多,就會報出java.lang.StackOverflowError。因此在部署線上應用前,請根據實際情形適當調整棧大小。

相關文章
相關標籤/搜索