day11-栈的相关面试题

举例栈溢出的情况?

StackOverflowError,通过-Xss设置大小,
1.局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
2.递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
3.指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。

调整栈大小,就能保证不出现溢出吗?

不能,如果说一个执行6000次递归就结束的程序,在可执行递归5000次的内存空间中会出现StackOverflowError,而在调整为可递归7000次的内存空间时就不会出现StackOverflowError。如果程序是类似死递归情况无论怎样调整栈大小,都会出现溢出现象,对于这种情况,调整栈的大小理论上只能说是出现异常的时间晚一些而已。

分配的栈内存越大越好吗?

不是,理论上好像会在一定时间或单位时间内减少StackOverflowError的概率,避免出现StackOverflowError过早,但是避免不了出现StackOverflowError。对栈空间来说是好事,但是这样会导致可执行的线程数减少,对其他内存结构也是有影响的。

垃圾回收是否会涉及到虚拟机栈?

不涉及,虚拟机栈会出现StackOverflowError,但是不会出现GC,因为只有进栈出栈,出栈的过程就相当于GC(程序计数器不会Error和GC,堆会GC和ERROR,方法区也会出现GC和ERROR)

方法中定义的局部变量是否线程安全?

何为线程安全?
如果只有一个线程才可以操作此数据,则必是线程安全的。
如果有多个线程操作此数据,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题。
如果变量时在方法内部产生且在内部消亡,就是安全的;不是内存产生,或者作为返回值返回的(生命周期没有结束)就不是安全的

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