舉例棧溢出的情況?
StackOverflowError,通過-Xss設置大小,
1.局部數組過大。當函數內部的數組過大時,有可能導致堆棧溢出。
2.遞歸調用層次太多。遞歸函數在運行時會執行壓棧操作,當壓棧次數太多時,也會導致堆棧溢出。
3.指針或數組越界。這種情況最常見,例如進行字符串拷貝,或處理用戶輸入等等。
調整棧大小,就能保證不出現溢出嗎?
不能,如果說一個執行6000次遞歸就結束的程序,在可執行遞歸5000次的內存空間中會出現StackOverflowError,而在調整爲可遞歸7000次的內存空間時就不會出現StackOverflowError。如果程序是類似死遞歸情況無論怎樣調整棧大小,都會出現溢出現象,對於這種情況,調整棧的大小理論上只能說是出現異常的時間晚一些而已。
分配的棧內存越大越好嗎?
不是,理論上好像會在一定時間或單位時間
內減少StackOverflowError的概率,避免出現StackOverflowError過早
,但是避免不了
出現StackOverflowError。對棧空間來說是好事,但是這樣會導致可執行的線程數減少,對其他內存結構也是有影響的。
垃圾回收是否會涉及到虛擬機棧?
不涉及,虛擬機棧會出現StackOverflowError,但是不會出現GC,因爲只有進棧出棧,出棧的過程就相當於GC(程序計數器不會Error和GC,堆會GC和ERROR,方法區也會出現GC和ERROR)
方法中定義的局部變量是否線程安全?
何爲線程安全?
如果只有一個線程纔可以操作此數據,則必是線程安全的。
如果有多個線程操作此數據,則此數據是共享數據。如果不考慮同步機制的話,會存在線程安全問題。
如果變量時在方法內部產生且在內部消亡,就是安全的;不是內存產生,或者作爲返回值返回的(生命週期沒有結束)就不是安全的