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?