栈溢出的情况?
栈溢出:StackOverflowError;
举个简单的例子:在main方法中调用main方法,就会不断压栈执行,直到栈溢出;
栈的大小可以是固定大小的,也可以是动态变化(动态扩展)的.
如果是固定的,可以通过-Xss设置栈的大小;
如果是动态变化的,当栈大小到达了整个内存空间不足了,就是抛出OutOfMemory异常(java.lang.OutOfMemoryError)
调整栈大小,就能保证不出现溢出吗?
不能.因为调整栈大小,只会减少出现溢出的可能,栈大小不是可以无限扩大的,所以不能保证不出现溢出
分配的栈内存越大越好吗?
不是,因为增加栈大小,会造成每个线程的栈都变的很大,使得一定的栈空间下,能创建的线程数量会变小
垃圾回收是否会涉及倒虚拟机栈?
不会;垃圾回收只会涉及到方法区和堆中,方法区和堆也会存在栈溢出的可能;
程序计数器,只记录运行下一行的地址,不存在栈溢出和垃圾回收;
虚拟机栈和本地方法栈,都是只涉及压栈和出栈,可能存在栈溢出,不存在垃圾回收.
方法中定义的局部变量是否线程安全?
具体问题具体分析,见分析代码:
**
* @ClassName StringBuilderDemo
* @Description
*
* 方法中定义的局部变量是否线程安全?具体情况具体分析
*
* 何为线程安全?
* 如果只有一个线程才可以操作此数据就,则必是线程安全的
* 如果有多个线程操作此线程,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题
*
* @author taemin
* @date 2020-05-04 14:35
*/
public class StringBuilderDemo {
//s1的声明方式是线程安全的,因为线程私有,在线程内创建的s1 ,不会被其它线程调用
public static void method1(){
//StringBuilder:线程不安全
StringBuilder s1=new StringBuilder();
s1.append("a");
s1.append("b");
//...
}
//stringBuilder的操作过程:是线程不安全的,
// 因为stringBuilder是外面传进来的,有可能被多个线程调用
public static void method2(StringBuilder stringBuilder){
stringBuilder.append("a");
stringBuilder.append("b");
//...
}
//stringBuilder的操作:是线程不安全的;因为返回了一个stringBuilder,
// stringBuilder有可能被其他线程共享
public static StringBuilder method3(){
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("a");
stringBuilder.append("b");
return stringBuilder;
}
//stringBuilder的操作:是线程安全的;因为返回了一个stringBuilder.toString()相当于new了一个String,
// 所以stringBuilder没有被其他线程共享的可能
public static String method4(){
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("a");
stringBuilder.append("b");
return stringBuilder.toString();
/**
* 结论:如果局部变量在内部产生并在内部消亡的,那就是线程安全的
*/
}
}