并发编程——1.java内存图及相关内容

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

这篇文章,我们来讲一下java的内存图及并发编程的预备内容。

首先,我们来看一下下面的这两段代码:

并发编程——1.java内存图及相关内容,并发编程,java,开发语言

并发编程——1.java内存图及相关内容,并发编程,java,开发语言

下面,我们给出上面这两段代码在运行时的内存结构图,如下图所示:

并发编程——1.java内存图及相关内容,并发编程,java,开发语言

下面,我们来具体的讲解一下。

首先,我们写了一个java程序是以.java的文件形式保存在磁盘中的,当我们运行它的时候,首先,jdk会将其编译为.class文件,用的是javac命令,也是在磁盘中,然后,jre会去运行.class文件,用的是java命令,然后,我们的程序就被运行了,这是整个过程。

当我们需要去运行一个java程序时,或者说,当jdk用javac命令去编译一个.java文件的时候,操作系统就会在内存中开辟一片区域,叫java运行时内存,里面存储我们一个java程序在运行时的所有信息。

java运行时内存中会有方法区,里面存放的是我们类的信息,包括类的成员变量和成员方法。方法区中还有一块叫做静态方法区,里面存放的是我们类中的静态方法。方法区中的内容在类被编译的时候就会生成,生成之后会将类中的静态方法拷贝一份到静态方法区。注意,java中的所有静态资源在类被编译的时候都会被初始化。根据代码我们可以知道,person类中只有m4是静态方法,它会被拷贝到静态方法区中,Test1中所有的方法都是静态方法,都会被拷贝到静态方法区中。

之后会有一块栈区,它是控制方法的执行顺序及变量的定义域。程序是从main方法开始执行的,所以首先main方法入栈,然后main方法中创建了3个person类的实例,即x1,x2,x3,所以java会在堆内存中创建三个实例对象,这三个实例对象会存储类的一切信息,除了静态方法。然后main方法调用m1方法,m1方法入栈,m1方法调用m2方法,m2方法入栈,m2方法调用m3方法,m3方法入栈,m3方法中创建person类的实例x1,所以java在堆内存中创建出实例对象,然后m3方法执行实例x1的m2方法,所以m3方法中的实例x1的m2方法入栈,而该实例的m2方法又调用该类的m1方法,所以该实例的m1方法入栈,等m1执行结束后,x1的m1方法出栈,然后x1的m2出栈,然后Test1的m3出栈,然后Test1的m2出栈,然后Test1的m1出栈,然后回到main方法中再依次往下执行。这就是一个java程序执行的整个流程。

以上的内存模型只是一种简略内存模型,更详细的内存模型大家可以去参考我的JVM系列内容。

上面只是单个线程的,下面来看一下多线程的。

看一下下面的这段代码:

并发编程——1.java内存图及相关内容,并发编程,java,开发语言

看一下输出结果:

并发编程——1.java内存图及相关内容,并发编程,java,开发语言

我们结合上面单线程的内存分布,来分析一下这段代码的内存分布:

并发编程——1.java内存图及相关内容,并发编程,java,开发语言

代码的编译和方法区就不说了,直接从主方法开始说。

代码是从主方法开始运行的,运行主方法的时候,java会在栈区中开辟出主线程栈,然后主方法入栈,执行,执行到第5行的时候,代码new了一个新的线程x1,所以在堆中创建出线程x1的实例,这个实例非常复杂,但是我们可以将他简化为里面有start和run两个方法。创建完成之后,同时,在栈区中创建新的线程x1,在线程x1中,方法run拷贝入栈,准备执行,同时,主线程栈中的代码也会执行,所以就有我们看到的运行结果:线程x1和主线程交替着打印输出。

这样解释可能不好理解,下面换个角度解释一下。

并发编程——1.java内存图及相关内容,并发编程,java,开发语言

这是我电脑的部分CPU的部分性能信息,我们来看下面的几行信息。

进程,进程的科学定义是:进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。通俗的说:进程就是程序的一次执行过程。进程数213,就是说,当前时刻,我的电脑上有213个程序处于“运行”状态(或者说开着)。

线程,线程是CPU调度的最小单位,简单来说,CPU每次只能运行线程,不能运行进程。线程数3190,就是说当前时刻,我的电脑上一共有3190个线程,并且这3190个线程是分布在213个进程中的(进程是由线程组成的)

句柄,就是变量,句柄107879,就是说当前时刻,我的电脑内存中一个包含107879个变量。

内核,就是CPU的核数,一个CPU有多少核数,那么这个CPU在同一时刻就能执行多少个线程。我的CPU是8核的,说明我的电脑在同一时刻能跑8个线程。

CPU的核数是一定的,线程数是变化的,并且线程数是远远大于核数的,CPU每次只能执行8个线程,那么剩下的线程就只能暂时处于其他状态(这个操作系统中有介绍),但是一台电脑不可能只靠这8个线程来运行,所以CPU是在不停的做线程切换的,也就是说CPU每个线程执行一段时间然后就切换去执行另一个线程,这就是多线程。

明白了这点,我们再看上面的代码,那是两个线程,主线程和x1线程,他们两个竞争者进入CPU,然后被CPU执行,当某个线程被CPU选中时,那个这个线程中的内容就会被执行,但是它不是直接执行完的,而是会有线程的切换,当它被切换出去了,它就不会被执行了,也就不会被打印输出了。这就是上面交替输出的原因。

前面说了线程的切换,线程的状态等内容,这些是操作系统中的,这里只是简单的提到,如果想要具体的了解,可以参考我的操作系统专栏中的内容。

这篇文章比较散,就是讲了一下一个java程序在运行时的内存结构图,然后稍微的提到了多线程。这些都是比较基础的,都是要好好掌握。文章来源地址https://www.toymoban.com/news/detail-725882.html

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

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

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

相关文章

  • 🔥🔥Java开发者的Python快速进修指南:网络编程及并发编程

    今天我们将对网络编程和多线程技术进行讲解,这两者的原理大家都已经了解了,因此我们主要关注的是它们的写法区别。虽然这些区别并不是非常明显,但我们之所以将网络编程和多线程一起讲解,是因为在学习Java的socket知识时,我们通常会将它们结合使用,以实现服务器

    2024年02月05日
    浏览(69)
  • 深入理解并发编程艺术之内存模型

    随着硬件技术的飞速发展,多核处理器已经成为计算设备的标配,这使得开发人员需要掌握并发编程的知识和技巧,以充分发挥多核处理器的潜力。然而并发编程并非易事,它涉及到许多复杂的概念和原理。为了更好地理解并发编程的内在机制,需要深入研究内存模型及其在

    2024年02月14日
    浏览(48)
  • 并发编程之三大特性及JMM内存模型

    目录 原子性 如何保证原子性 可见性 如何保证可见性 有序性 如何保证有序性 Java内存模型(JMM内存模型) Java内存模型的一些关键概念: 主内存与工作内存交互协议 Java内存模型通过以下手段来确保多线程程序的正确性: 锁机制 volatile volatile禁止指令重排序  Happens-Before 并发三

    2024年01月19日
    浏览(46)
  • 【JavaEE】并发编程(多线程)线程安全问题&内存可见性&指令重排序

    目录 第一个问题:什么是线程安全问题? 第二个问题:为什么会出现线程安全问题?  第三个问题:如何解决多线程安全问题?  第四个问题:产生线程不安全的原因有哪些?  第五个问题:内存可见性问题及解决方案  第六个问题:指令重排序问题? 线程安全就是多线程

    2024年02月01日
    浏览(65)
  • 【JAVA开发面试】如何处理并发访问如何进行代码的单元测试Java多线程编程消息中间件设计模式技术难题是如何解决的

    【 点我-这里送书 】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明

    2024年02月03日
    浏览(52)
  • 数据结构:图及相关算法讲解

    概念多,但是不难理解,难的算法部分基本都是图解。 图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E),其中 V为顶点集合,E为边集合 。 顶点和边 :图中结点称为顶点,第i个顶点记作vi。两个顶点vi和vj相关联称作顶点vi和顶点vj之间有一条边,图中的第k条边

    2024年03月12日
    浏览(39)
  • GO语言网络编程(并发编程)并发介绍,Goroutine

    进程和线程 并发和并行 协程和线程 协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。 线程:一个线程上可以跑多个协程,协程是轻量级的线程。 goroutine 只是由官方实现的超级\\\"线程池\\\"。 每个

    2024年02月09日
    浏览(58)
  • 各个语言运行100万个并发任务需要多少内存?

    原文链接:https://pkolaczk.github.io/memory-consumption-of-async/ Github项目地址:https://github.com/pkolaczk/async-runtimes-benchmarks 在这篇博客文章中,我深入探讨了异步和多线程编程在内存消耗方面的比较,跨足了如Rust、Go、Java、C#、Python、Node.js 和 Elixir等流行语言。 不久前,我不得不对几个

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

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

    2024年02月13日
    浏览(23)
  • 要利用Java编程提升人们对安全教育的兴趣,可以开发一些互动性强、内容生动有趣的教育软件或游戏

    要利用Java编程提升人们对安全教育的兴趣,可以开发一些互动性强、内容生动有趣的教育软件或游戏。以下是一些建议: 开发安全教育游戏:使用Java编程语言,可以开发一些有关于安全教育的小游戏,如模拟火灾逃生、地震自救等场景,让玩家在游戏中学习到安全知识。

    2024年04月27日
    浏览(62)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包