虚拟机栈相关的问题
Q:举例栈溢出的情况?(StackOverflowError)
A:递归调用等,通过-Xss设置栈的大小
Q:调整栈的大小,就能保证不出现溢出么?
A:不能,如递归无限次数肯定会溢出,调整栈大小只能保证溢出的时间晚一些
Q:分配的栈内存越大越好么?
A:不是 会挤占其他线程的空间
Q:垃圾回收是否会涉及到虚拟机栈?
A:不会
内存区块 | Error | GC |
程序计数器 | 无 | 无 |
本地方法栈 | 有 | 无 |
虚拟机栈 | 有 | 无 |
堆区 | 有 | 有 |
方法区 | 有 | 有 |
Q:方法中定义的局部变量是否线程安全
A:要具体情况具体分析
1 /** 2 * 方法中定义的局部变量是否线程安全?具体情况具体分析 3 * 4 * 何为线程安全? 5 * 如果只有一个线程可以操作此数据,则毙是线程安全的。 6 * 如果有多个线程操作此数据,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题 7 * 8 * StringBuffer是线程安全的,StringBuilder不是 9 */ 10 public class StringBuilderTest { 11 12 //s1的声明方式是线程安全的 13 public static void method1(){ 14 StringBuilder s1 = new StringBuilder(); 15 s1.append("a"); 16 s1.append("b"); 17 } 18 19 //stringBuilder的操作过程:是不安全的,因为method2可以被多个线程调用 20 public static void method2(StringBuilder stringBuilder){ 21 stringBuilder.append("a"); 22 stringBuilder.append("b"); 23 } 24 25 //s1的操作:是线程不安全的 有返回值,可能被其他线程共享 26 public static StringBuilder method3(){ 27 StringBuilder s1 = new StringBuilder(); 28 s1.append("a"); 29 s1.append("b"); 30 return s1; 31 } 32 33 //s1的操作:是线程安全的 ,StringBuilder的toString方法是创建了一个新的String,s1在内部消亡了 34 public static String method4(){ 35 StringBuilder s1 = new StringBuilder(); 36 s1.append("a"); 37 s1.append("b"); 38 return s1.toString(); 39 } 40 41 public static void main(String[] args) { 42 StringBuilder s = new StringBuilder(); 43 new Thread(()->{ 44 s.append("a"); 45 s.append("b"); 46 }).start(); 47 48 method2(s); 49 50 } 51 52 }
附:JVM学习目录