JVM(四)虚拟机栈(三)虚拟机栈面试题

JVM(四)虚拟机栈(三)虚拟机栈面试题


1 举例栈溢出的情况?

  • 当方法调用不停将栈帧压入虚拟机栈导致栈内空间不足而出现StackOverFlowError即是出现了栈溢出
  • 可以通过-Xss设置栈的大小,栈的大小可以是固定的也可以是动态变化的,如果固定且超出设定值则就会出现栈溢出;如果是动态变化的,栈空间不断扩容导致整个内存空间不足以分配,则会出现OutOfMemoryError
调整栈的大小就能保证栈不溢出了吗
  • 不能,只能延迟栈溢出的时间
分配的栈内存越大越好吗
  • 不是,毕竟整个内存的空间是有限的,栈占据的空间越大会导致其他部分占据的空间越小

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

​ 不会涉及到虚拟机栈,运行时数据区主要包括程序计数器本地方法栈虚拟机栈方法区五部分:

  • 程序计数器:存储指令地址,运行速度快占用空间小,不存在溢出问题,也没有垃圾回收
  • 本地方法栈:存在栈溢出,但是不存在垃圾回收
  • 虚拟机栈:存在栈溢出,但是不存在垃圾回收
  • 方法区:存在OOM和GC

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

  • 不一定,要看这个局部变量有没有指向外部的共享变量,如果有的话也是线程不安全的

  • 如果方法返回该局部变量,也有可能是线程不安全的,因为可能有其他线程接着对其进行修改:

    	public static StringBuilder method() {
            StringBuilder s = new StringBuilder();
            s.append("1");
            return s;
        }
    

    而下面的方法是线程安全的,因为String的不可变性:

    	public static StringBuilder method() {
            StringBuilder s = new StringBuilder();
            s.append("1");
            return s.toString();
        }
    
posted @ 2023-05-17 18:56  Tod4  阅读(25)  评论(0编辑  收藏  举报