虚拟机栈相关问题

1、举例栈溢出的情况?(StackOverflowError)
通过 -Xss 设置栈的大小

2、调整栈大小,就能保证不出现溢出么?
不能保证不溢出

3、分配的栈内存越大越好么?
不是,一定程度减少了内存溢出的概率,但是会挤占其它的线程空间,因为整个虚拟机的内存空间是有限的,会出现OOM

4、垃圾回收是否涉及到虚拟机栈?
不会。Java虚拟机栈只有入栈和出栈,销毁就是出栈

5、方法中定义的局部变量是否线程安全?
何为线程安全?
(1)如果只有一个线程才可以操作此数据,则必是线程安全的。
(2)如果有多个线程操作此数据,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题。
具体问题具体分析:
如果对象是在内部产生,并在内部消亡,没有返回到外部,那么它就是线程安全的,反之则是线程不安全的。

面试题:
方法中定义的局部变量是否线程安全?具体情况具体分析
何为线程安全?
如果只有一个线程才可以操作此数据,则必是线程安全的。
如果有多个线程操作此数据,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题。


public class StringBuilderTest {
    int num = 10;
 
    //s1的声明方式是线程安全的,方法调用压入栈帧,只在这个线程访问
    //定义的全局变量int num = 10;可能被多个线程访问就是线程不安全的
    public static void method1(){
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        //...
    }
    //sBuilder的操作过程:是线程不安全的,sBuilder从外面传递过来,可能被多个线程调用
    public static void method2(StringBuilder sBuilder){
        sBuilder.append("a");
        sBuilder.append("b");
        //...
    }
    //s1的操作:是线程不安全的
    public static StringBuilder method3(){
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        return s1;
    }
    //s1的操作:是线程安全的
    // s1.toString() 里面new String(),这个是线程不安全的,但是s1是线程安全的
    public static String method4(){
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        return s1.toString();
    }

6、运行时数据区,哪些部分存在Error和GC?
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值