⑧. 一些附加信息
- 栈帧中还允许携带与Java虚拟机实现相关的一些附加信息。例如,对程序调试提供支持的信息
⑨. 问题小结与扩展
①. 栈溢出的情况?栈溢出:StackOverflowError
栈中是不存在GC的,存在OOM和StackOverflowError
举个简单的例子:在main方法中调用main方法,就会不断压栈执行,直到栈溢出;
栈的大小可以是固定大小的,也可以是动态变化(动态扩展)的
如果是固定的,那么会抛出StackOverflowError
如果是动态扩展的,那么会抛出OOM异常(java.lang.OutOfMemoryError)
②. 调整栈大小,就能保证不出现溢出吗?
不能。因为调整栈大小,只会减少出现溢出的可能,栈大小不是可以无限扩大的,所以不能保证不出现溢出
③. 分配的栈内存越大越好吗?
不是,因为增加栈大小,会造成每个线程的栈都变的很大,使得一定的栈空间下,能创建的线程数量会变小
④. 垃圾回收是否会涉及到虚拟机栈?
不会;垃圾回收只会涉及到方法区和堆中,方法区和堆也会存在溢出的可能
程序计数器,只记录运行下一行的地址,不存在溢出和垃圾回收
虚拟机栈和本地方法栈,都是只涉及压栈和出栈,可能存在栈溢出,不存在垃圾回收
⑤. 方法中定义的局部变量是否线程安全?
/**方法中定义的局部变量是否线程安全? 具体问题具体分析 * @author shkstart * @create 15:53 */ public class LocalVariableThreadSafe { //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(); /** * 结论:如果局部变量在内部产生并在内部消亡的,那就是线程安全的 */ } }