虚拟机栈相关的问题

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学习目录

 

posted @ 2020-06-09 14:57  叮叮叮叮叮叮当  阅读(220)  评论(0编辑  收藏  举报