首页 > 编程语言 >Java并发(四)----线程运行原理

Java并发(四)----线程运行原理

时间:2023-05-05 22:22:06浏览次数:36  
标签:method2 method1 Object ---- 线程 内存 Java 栈帧

1、线程运行原理

1.1 栈与栈帧  

Java Virtual Machine Stacks (Java 虚拟机栈 JVM)

我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。

  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存

  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

单线程示例代码

public class TestFrames {
    public static void main(String[] args) {
        method1(10); // 断点处
    }
​
    private static void method1(int x) {
        int y = x + 1;
        Object m = method2();
        System.out.println(m);
    }
​
    private static Object method2() {
        Object n = new Object();
        return n;
    }
}

在打断点处,可以看到一个栈帧

执行到method1,可以看到新起了一个栈帧

当执行到method2时,可以看到又新起了一个栈帧

由于是栈,随着的程序的运行,后面开启的栈帧会先被销毁,直至main栈帧被销毁,此刻程序运行完成。

对应图解:

内存释放后

具体就是:

1.将编译好的字节码加载到jvm的方法区内存中 2.jvm启动一个main的主线程,cpu核心就准备运行主线程的代码了,给主线程分配自己的栈内存【args、局部变量、返回地址、所记录】,每个线程的栈里面还有个程序计数器 程序计数器的作用:当cpu要执行哪行代码了,就去这个里面去要 3.把主方法的里面代码行放到程序计数器 4.主方法调用的是method1的方法,为method1分配栈内存,里面存储这个方法里面局部变量,返回地址,这些变量是分配内存时,会把空间预留好 5.将method1的第一行读到程序计数器让cpu执行 6.methode1下一行调用method2()方法,创建他的栈内存 7.把Object n = new Object()这行代码读取到计数器,在队中创建对象 8.method2()将返回地址给m,方法执行完就可以释放掉method2()的栈内存 9.一层层方法结束后,依次释放掉每个方法线程

现在来看看多线程下的栈与栈帧

public class TestFrames {
    public static void main(String[] args) {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                method1(20);// 断点处
            }
        };
        t1.setName("t1");
        t1.start();
        method1(10);// 断点处
    }
​
    private static void method1(int x) {
        int y = x + 1;
        Object m = method2();
        System.out.println(m);
    }
​
    private static Object method2() {
        Object n = new Object();
        return n;
    }
}
​

在第一个断点处

可以看到多个线程同时运行中,我们可以选择具体的线程来查看运行状况并且往下运行,具体的读者可以自行实践。

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

因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码(简单来说就是从使用cpu到不使用cpu

  • 线程的 cpu 时间片用完

  • 垃圾回收

  • 有更高优先级的线程需要运行

  • 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法

当 Context Switch(上下文切换) 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的

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

  • Context Switch 频繁发生会影响性能,因为线程数不是越多越好。

 

标签:method2,method1,Object,----,线程,内存,Java,栈帧
From: https://www.cnblogs.com/xiaoyh/p/16964644.html

相关文章

  • 实验5
    实验1.1运行代码#include<stdio.h>#defineN4intmain(){ intx[N]={1,9,8,4}; inti; int*p; for(i=0;i<N;++i) printf("%d",x[i]); printf("\n");//for(i=0;p<x+N;++p) //printf("%d",*p); //p......
  • The plugin distribution bundles IDE packages 'com.intellij.uiDesigner.core',
    错误描述:TheplugindistributionbundlesIDEpackages'com.intellij.uiDesigner.core','com.intellij.uiDesigner'.BundlingIDEpackagesisconsideredbadpracticeandmayleadtosophisticatedcompatibilityproblems.Considerexcludingthe......
  • [HNCTF 2022 WEEK2]
    easy_unser<?phpinclude'f14g.php';error_reporting(0);highlight_file(__FILE__);classbody{private$want,$todonothing="ican'tgetyouwant,ButyoucantellmebeforeIwakeupandchangemymind"......
  • 初识操作符
    操作符:算数操作符:+-*/%  c语言中除法是等到的结果是“商”,从根上讲除号两端都是整形,得出来的结果都是整数除号两端其中一个是小数,就是执行小数除法所以在写代码中想要执行小数除法必须两端需要有一个数是小数,得出来的数才是小数  在c语言中%是取模(余),所以这里......
  • keepalived-学习目录
    1、Keepalived基本概述https://www.cnblogs.com/ygbh/p/17373758.html2、Keepalived安装https://www.cnblogs.com/ygbh/p/17373985.html3、keepalived高可用配置【抢占式】https://www.cnblogs.com/ygbh/p/17374339.html4、keepalived高可用配置【非抢占式】https:/......
  • 8.5.1 直线与直线平行
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高一数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2921718.html)\({\color{Red}{跟贵哥学数学,so\quadeasy!}}\)必修第二册同步巩固,难度2颗星!基础知识基本事实4(1)内容平......
  • 浅谈一下对于 js 中的 this 的理解
    浅谈一下对于js中的this的理解对于this值的定义:简单来说this是一个对象,这个对象具体的值是什么,取决于运行时的环境,即代码执行时的环境。MDN:当前执行上下文(global、function或eval)的一个属性,在非严格模式下,总是指向一个对象,在严格模式下可以是任意值。......
  • 【博学谷学习记录】超强总结,用心分享 | 知识点总结1
    【博学谷IT技术支持】zookeeper基础架构是:主从架构安装虚拟机必须安装jdk角色:leader,Follower,Observerzookeeper的特性全局一致性顺序性原子性实时性zookeeper的watch机制zookeeper的选举机制hadoop基础主从集群NameNodeSecondaryNamenodeDataNodeHDFS......
  • [ACTF新生赛2020]usualCrypt 1
    日常查壳:32位,运行看看:(有点嚣张,但不多),任意输入退出。进IDA看主函数:进入主函数后,首先是读入一个字符串,然后是对该字符串进行sub_401080方法加密,最后是对比。那么我们跟进方法,看看是什么加密类型:第一眼下去还多了一个方法sub_401000(),跟进看看:不多说,检查这两的内存:可以......
  • Linux 将另一服务器上的文件或文件夹复制到当前服务器
    1.文件复制1.1 将本地文件拷贝到远程  scp文件名用户名@计算机IP或者计算机名称:远程路径例如:scp/root/install.*[email protected]:/usr/local/src1.2 从远程将文件拷回本地scp用户名@计算机IP或者计算机名称:文件名本地路径例如:[email protected]......