Java 多线程之线程运行原理(八)

正文

栈与栈帧

JVM 中由堆、栈、方法区(JDK 1.8 后改为元空间)组成,其中栈内存是给启动后的线程使用。

  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的方法

代码

public class ThreadFrames {
    public static void main(String[] args) {
        test1(1);
    }

    private  static  void test1( int x){
        int y = x +1;
        Integer i = test2();
        System.out.println(1);
    }

    private static  Integer test2(){
        Integer j = 15;
        return  j;
    }
}

在这里插入图片描述


特点
栈内存管理非常简单,方法执行完毕就直接释放了,不用堆内存那么麻烦需要垃圾回收。


线程上下文切换(Thread Context Switch)

因为某些原因导致 CPU 不再执行当前线程,转而执行另一个线程的代码,如

  • 线程CPU时间片用完
  • 垃圾回收
  • 更高优先级的线程需要运行
  • 线程调用了 sleep、yield、wait、join、park、synchronized、lock 等方法

上下文切换时,需要操作系统保存当前线程的状态,并去回复到另一个线程的状态, Java 中对应的记录其状态的就是 程序计数器。

作用就是记住下一条 JVM 指令的执行地址,是线程私有的。

状态:包括程序计数器、虚拟机栈中每个栈帧的信息(局部变量表、操作数栈、返回地址等)

频繁上下文切换会影响性能


大白话 :你在打游戏(线程一 代码),突然你老妈说没酱油了,赶紧去买一瓶回来(线程二 代码),于是你很不情愿的把游戏存档(保存状态),跑去买酱油。

回来之后继续把刚刚存档的游戏,加载继续玩。

如果隔三差五让你中断游戏,一会打扫房间、一会拿快递,你觉得会不会影响你心态(性能)?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值