day11-棧的相關面試題

舉例棧溢出的情況?

StackOverflowError,通過-Xss設置大小,
1.局部數組過大。當函數內部的數組過大時,有可能導致堆棧溢出。
2.遞歸調用層次太多。遞歸函數在運行時會執行壓棧操作,當壓棧次數太多時,也會導致堆棧溢出。
3.指針或數組越界。這種情況最常見,例如進行字符串拷貝,或處理用戶輸入等等。

調整棧大小,就能保證不出現溢出嗎?

不能,如果說一個執行6000次遞歸就結束的程序,在可執行遞歸5000次的內存空間中會出現StackOverflowError,而在調整爲可遞歸7000次的內存空間時就不會出現StackOverflowError。如果程序是類似死遞歸情況無論怎樣調整棧大小,都會出現溢出現象,對於這種情況,調整棧的大小理論上只能說是出現異常的時間晚一些而已。

分配的棧內存越大越好嗎?

不是,理論上好像會在一定時間或單位時間內減少StackOverflowError的概率,避免出現StackOverflowError過早,但是避免不了出現StackOverflowError。對棧空間來說是好事,但是這樣會導致可執行的線程數減少,對其他內存結構也是有影響的。

垃圾回收是否會涉及到虛擬機棧?

不涉及,虛擬機棧會出現StackOverflowError,但是不會出現GC,因爲只有進棧出棧,出棧的過程就相當於GC(程序計數器不會Error和GC,堆會GC和ERROR,方法區也會出現GC和ERROR)

方法中定義的局部變量是否線程安全?

何爲線程安全?
如果只有一個線程纔可以操作此數據,則必是線程安全的。
如果有多個線程操作此數據,則此數據是共享數據。如果不考慮同步機制的話,會存在線程安全問題。
如果變量時在方法內部產生且在內部消亡,就是安全的;不是內存產生,或者作爲返回值返回的(生命週期沒有結束)就不是安全的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章