java内存区 || 并发

这篇具有很好参考价值的文章主要介绍了java内存区 || 并发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

什么是线程?

线程的创建和上下文切换:

线程的入栈和出栈:

堆栈的作用:

CPU核心数概念

线程的start状态

就绪队列

操作系统的时间片

线程中代码执行顺序

实际中内存图


什么是线程?

  1. 线程的创建和上下文切换:

    • 创建线程:线程的创建是通过调用操作系统提供的线程创建函数或类似机制来完成的。当创建一个线程时,操作系统会为它分配独立的堆栈内存区域,并为其设置一个唯一的标识符。同时,该线程也会共享进程的其他资源,如内存、文件描述符等。
    • 上下文切换:在多线程环境下,操作系统会根据一定的调度策略来决定使用哪个线程执行,这个过程称为上下文切换。上下文切换涉及到将当前线程的上下文(包括程序计数器、寄存器值等)保存起来,然后恢复切换到的线程的上下文。
  2. 线程的入栈和出栈:

    • 入栈过程:当线程被调度执行时,它的执行流会从当前程序指令流入栈,即将当前执行点(例如程序计数器)推入线程的堆栈中。这样可以保留当前执行点,以便在上下文切换后能够恢复到正确的执行点。
    • 出栈过程:当一个线程的执行结束或被调度让出执行权时,它的执行流会从堆栈中弹出,即将保存的执行点弹出,恢复到之前的执行点,并在适当的位置继续执行。
  3. 堆栈的作用:

    • 堆栈的主要作用是存储线程执行过程中的局部变量、函数调用信息以及控制流相关的上下文信息。每个线程都有自己的堆栈,以保证线程之间的数据隔离和独立性。
    • 堆栈还用于存储函数调用的参数和返回地址,在函数调用时,参数会被压入堆栈,函数执行完毕后,根据返回地址可以将控制流返回到调用者的正确位置。

CPU核心数概念

CPU的核心某一时刻只能够执行一个任务

如果有多个线程的话 ,他们就会立刻去抢占cpu

  1. 并行执行:如果CPU拥有多个核心,每个核心都可以并行执行不同的任务。这意味着在具有多个核心的系统中,多个线程可以同时运行在不同的核心上,从而实现并行计算和执行多个任务。

  2. 进程和线程的调度:当有多个线程需要执行时,操作系统的调度器会根据一定的策略将线程分配到不同的核心上运行。调度器通常基于一些算法,如时间片轮转或优先级来确定哪个线程被调度到哪个核心上。这样可以实现多个线程的并发执行。

  3. 线程抢占:当多个线程同时竞争同一个核心时,操作系统可以通过线程调度机制来实现线程的抢占。线程抢占是指当一个线程占用了核心时,如果拥有更高优先级的线程需要执行,操作系统可以暂停当前线程的执行,并切换到更高优先级的线程去执行。这种方式可以实现对CPU资源的公平分配,确保高优先级的任务能够及时执行。

线程的start状态

.start()只是让线程进入就绪态,然后交由操作系统去管理,它会先放入就绪队列,然后操作系统进行选择去执行

就绪队列

任何预言中的线程都只是提交到操作系统中的就绪队列,不可能让他立刻执行

操作系统中的就绪队列并不是一个先进先出的队列,也就是说先进入就绪态的方法不一定先被执行

操作系统的时间片

就绪队列中的任务被选中的时候,,操作系统就会同时分配一个执行时间,如果在时间内没有执行完,就保留当前状态并去执行其他线程,不会让一个线程一直霸占着资源

这也就导致了 先就绪的线程但不一定是先执行完的

线程中代码执行顺序

同一个线程中肯定是从上向下开始执行的

不同的线程中,代码执行顺序是不一样的

实际中内存图

public class Person {
    public void m1(){}
    public void m2(){
        m3();
    }
    public void m3(){}
}
public class Test {
    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        Thread x1 = new Thread() {
            @Override
            public void run() {
                Person w1 = new Person();
                w1.m2();
            }
        };
        Thread x2 = new Thread() {
            @Override
            public void run() {
                Person w1 = new Person();
                w1.m3();
            }
        };
        ///=====
        x1.start();
        x2.start();

        Person w1 = new Person();
        w1.m1();
    }

 当Test运行的时候,内存中是这样子的

当第一进行运行的时候,先将java文件编译成class文件,之后将所有的方法存入到方法区,如果有static的方法还会拷贝一份存入到静态方法区,之后开始main方法入栈,将其中的元素加入栈中,然后就会在堆中创建相应的实例

java内存区 || 并发,java,jvm,开发语言文章来源地址https://www.toymoban.com/news/detail-547624.html

到了这里,关于java内存区 || 并发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[JVM]——JVM内存结构

    参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM 是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构:   方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是

    2024年02月12日
    浏览(46)
  • JVM——Java 内存区域详解

    如果没有特殊说明,都是针对的是 HotSpot 虚拟机。 基本问题 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题 String 类和常量池 8 种基本

    2024年02月13日
    浏览(41)
  • Java jvm 内存溢出分析

    我们经常用visualVm监控Jvm的内存,cpu,线程的使用情况,通常可以根据内存不断增长来判断内存是否存在不释放。但是我们不可能时时盯着去看,这里涉及jvm堆内存配置,堆内存参数配置和调优会在其他章节编写。 如果真是内存溢出了,线上出现的我们需要配置JVm内存溢出,

    2024年02月09日
    浏览(53)
  • java内存区 || 并发

    目录 什么是线程? 线程的创建和上下文切换: 线程的入栈和出栈: 堆栈的作用: CPU核心数概念 线程的start状态 就绪队列 操作系统的时间片 线程中代码执行顺序 实际中内存图 线程的创建和上下文切换: 创建线程:线程的创建是通过调用操作系统提供的线程创建函数或类

    2024年02月13日
    浏览(22)
  • Java 并发之《深入理解 JVM》关于 volatile 累加示例的思考

    在周志明老师的 《深入理解 JVM》一书中关于 volatile 线程安全性有一个示例代码(代码有些许改动,语义一样): 老师的目的是为了说明在多线程环境下 volatile 只能保证可见性而不是线程安全的。但是当在我的 IDEA 下运行时,发现程序是没有输出结果且始终是

    2024年01月20日
    浏览(52)
  • java JVM 内存GC查看

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 1、命令格式 jstat命令命令格式: jstat [Options] vmid [interval] [count] 参数说明: Options,选项,我们一般使用 -gcutil 查看gc情况 vmid,VM的进程号,即

    2024年01月22日
    浏览(31)
  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(49)
  • 【JVM】Java内存泄露的排查思路?

    Java内存泄露(Memory Leak)是指在Java程序中,无用的对象占用了 堆内存 ,但无法被垃圾回收器回收释放,从而导致可用内存逐渐减少,最终可能导致内存耗尽或性能下降的问题。 说明一般对于内存泄漏。都是针对 堆 的。 程序一般出现内存泄漏会有 两个状态 一是一启动导致

    2024年02月13日
    浏览(47)
  • [JVM] 浅谈JMM(Java 内存模型)

    Java 内存模型(Java Memory Model,JMM)是 Java 虚拟机规范中定义的一种抽象计算机内存模型,用于描述 Java 程序在多线程下的内存访问行为。JMM 定义了线程之间共享变量的可见性和有序性规则,为开发者提供了一种可靠的同步机制,以避免并发程序中常见的线程安全问题。 JMM

    2024年01月16日
    浏览(54)
  • JVM之jmap java内存映射工具

    jdk安装后会自带一些小工具, jmap 命令( Memory Map for Java )是其中之一。主要用于打印指定Java进程(或核 心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的 大

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包