百度竞价排名的优缺点,企业网站seo优化外包,网站建设开发的目的,设计网站首页多少钱JVM基础篇-虚拟机栈 定义
Java Virtual Machine Stacks #xff08;Java 虚拟机栈#xff09;
每个线程运行时所需要的内存#xff0c;称为虚拟机栈每个栈由多个栈帧#xff08;Frame#xff09;组成#xff0c;对应着每次方法调用时所占用的内存每个线程只能有一个活动…JVM基础篇-虚拟机栈 定义
Java Virtual Machine Stacks Java 虚拟机栈
每个线程运行时所需要的内存称为虚拟机栈每个栈由多个栈帧Frame组成对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧对应着当前正在执行的那个方法
栈帧组成部分:方法参数、局部变量、返回地址
执行流程
方法执行时执行压栈操作如果该方法调用了其他方法其他方法被调用时执行压栈操作方法执行完成后执行出栈操作 问题辨析
垃圾回收是否涉及栈内存
答:不涉及当方法执行完成后会执行出栈操作对应的栈内存会被自动释放
栈内存分配越大越好吗
答:不是栈内存的越大只会使得方法递归调用的次数增大但是如果栈内存越大则意味着每个线程占用的内存越大而可同时运行的线程数则会变少
指定栈内存大小
-Xss:如果不设置在Linux/MacOS中默认为1024KBWindows系统则依赖于虚拟内存的大小
方法内的局部变量是否线程安全
如果方法内局部变量没有逃离方法的作用访问它是线程安全的如果是局部变量引用了对象并逃离方法的作用范围需要考虑线程安全,如果方法参数或返回值为基本类型则依然线程安全
package com.vmware.stack;public class Demo1 {public static void main(String[] args) {StringBuilder sb new StringBuilder();sb.append(1);sb.append(2);sb.append(3);new Thread(() - {m2(sb);}).start();}/*** apiNote 该方法中StringBuild线程安全因为外部无法方法*/public static void m1() {StringBuilder stringBuilder new StringBuilder();stringBuilder.append(1);stringBuilder.append(2);stringBuilder.append(3);System.out.println(stringBuilder.toString());}/*** param builder* apiNote 该方法线程不安全因为StringBuild可能有其他线程访问*/public static void m2(StringBuilder builder) {builder.append(1);builder.append(2);builder.append(3);System.out.println(builder.toString());}/*** apiNote 该方法线程不安全可能有其他线程访问返回值进行修改* return*/public static StringBuilder m3() {StringBuilder builder new StringBuilder();builder.append(1);builder.append(2);builder.append(3);return builder;}
}栈内存溢出
栈帧过多导致栈内存溢出 方法递归调用部分第三方类库溢出例如json序列化循环依赖 栈帧过大导致栈内存溢出