代码编织梦想

正文

栈与栈帧

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 指令的执行地址,是线程私有的。

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

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


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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/lzh754413563/article/details/111089572

笔记整理之多线程-爱代码爱编程

把之前的关于多线程的笔记整理了一下,如果有写的不对的地方,麻烦帮忙指出下,谢谢了。 目录 1不使用线程池的情况下,在一个方法中为什么不能重复调用同一个线程? 2线程对象调用run方法和调用start方法的区别: 3什么是高内聚,低耦合 4线程的生命周期 5创建线程的几种方式: 6多线程安全问题: 7多线程中解决同步问题的方式: 8Lock

多线程笔记以及案例总结-爱代码爱编程

多线程详解 线程简介 程序、进程、线程的关系什么是线程:线程是程序中执行的线程 Java虚拟机允许程序同时运行多个执行线程。进程:说起进程,就不得不说程序,程序是指令和数据得有序集合,其本身没有任何运行的意义,是一个静态的概念;而进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。通常在一个进程中乐意包含若干个线程,当然一盒

【java 自旋锁、轻量级锁、重量级锁、偏向锁】-爱代码爱编程

一、首先要讲这几个锁,需要了解一个知识点:对象头 java对象在堆中的存储模型为:对象头、实例数据、对齐填充                                                                                                                          

Java基础之同步锁(Synchronized)机制-爱代码爱编程

文章目录 同步锁机制它的修饰对象有几种:对象锁与类锁代码示例注意: 同步锁机制 Synchronized是java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 它的修饰对象有几种: 修饰一个类,其作用的范围是synchronized后面括号括起来的部分, 作用的对象是这个类的所有对象

C++使用RAII等待线程完成-爱代码爱编程

  一、问题                         在大多数情况下,我们需要等待线程完成自己销毁,而不是强制结束,以避免资源泄漏的情况发生。              通常我们使用线程代码是用join #include <iostream> #include <thread> int main() { bo

两个经典的线程安全示例分析-爱代码爱编程

示例1:卖票与买票 @Slf4j(topic = "c.CASE1") public class CASE1 { //随机数 public static Random random = new Random(); public static int getRandom(){ return random.nextIn