并发编程——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系列内容。
上面只是单个线程的,下面来看一下多线程的。
看一下下面的这段代码:

看一下输出结果:

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

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

这是我电脑的部分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程序在运行时的内存结构图,然后稍微的提到了多线程。这些都是比较基础的,都是要好好掌握。
相关文章:
并发编程——1.java内存图及相关内容
这篇文章,我们来讲一下java的内存图及并发编程的预备内容。 首先,我们来看一下下面的这两段代码: 下面,我们给出上面这两段代码在运行时的内存结构图,如下图所示: 下面,我们来具体的讲解一下。…...
Android studio安装详细教程
Android studio安装详细教程 文章目录 Android studio安装详细教程一、下载Android studio二、安装Android Studio三、启动Android Studio 一、下载Android studio Android studio安装的前提是必须保证安装了jdk1.8版本以上 1、打开android studio的官网:Download…...
Jetson Orin NX 开发指南(7): EGO-Swarm 的编译与运行
一、前言 EGO-Planner 浙江大学 FAST-LAB 实验室的开源轨迹规划算法是,受到 IEEE Spectrum 等知名科技媒体的报道,其理论技术较为前沿,是一种不依赖于ESDF,基于B样条的规划算法,并且规划成功率、算法消耗时间、代价数…...
nginx的重定向
nginx重定向--rewrite重写功能介绍 rewrite 的功能介绍 rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。 比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需…...
理解Go中的数组(Array)和切片(Slice)
引言 在Go中,数组和切片是由有序的元素序列组成的数据结构。当需要处理许多相关值时,这些数据集非常适合使用。它们使你能够将本应放在一起的数据放在一起,压缩代码,并一次性对多个值执行相同的方法和操作。 尽管Go中的数组和切…...
计算机毕业设计选什么题目好?springboot 高校学生综合测评管理系统
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...
在liunx下读取串口的数据
1. 设置串口参数 首先是通过stty工具设置串口参数: sudo stty -F /dev/ttyUSB0 比特率 cs8 -cstopb如:sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb. 注意: 需要注意的是这里需要sudo权限; 2. 读取串口数据 然后读取串口的…...
Python中使用IDLE调试程序
在IDLE中,使用菜单栏中的“Debug”对IDLE打开的python程序进行调试。 1 打开调试开关 选择IDLE菜单栏的“Debug->Debugger”,如图1①所示;此时在IDLE中会显示“[DEBUG ON]”,即“调试模式已打开”,如图1②所示&am…...
发个地区和对应的价格方案
在当今数字化的世界中,网络工程师面临着各种挑战,从跨界电商到爬虫,从出海业务到网络安全,再到游戏领域。为了应对这些挑战,网络工程师需要了解并利用各种技术,其中Socks5代理和代理IP技术成为了他们的得力…...
启动Java应用的黑魔法:初始化性能解密@PostConstrut,InitialzingBean,init-method,BeanPostProcessor
我们在项目中经常会遇到启动时做一些逻辑的处理,比如配置信息的预加载,缓存信息的预加载等等,那都有哪些方法了,我们一起来探讨一下: 1. 方式 1. 构造方法初始化: 使用构造方法进行对象的基本属性初始化。…...
STM32-C语言结构体地址
定义2个结构体 typedef struct _demo_node_{ //结构体本身的地址struct _demo_node_* pprenode; //实际地址开始的位置,最下面的输出结果可以看出struct _demo_node_* pnextnode;unsigned long member_num;unsigned short age;char addr[0]; …...
Go HTTP 调用(下)
今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出! 前言 上篇文章 Go HTTP 调用&#…...
mysql5.7获取json数组中的某个对象
前言 表中的一个字段类型是字符串,存的是一个对象数据。 现在要根据对象中的某个属性,获取到整个对象信息。 如果是mysql8,则可以使用JSON_TABLE。 示例:https://blog.csdn.net/weixin_44071721/article/details/123347229 sele…...
PTE考试解析
Pte 考试题目 注入漏洞 空格被过滤 用/**/代替空格,发现#被过滤 对#进行url编码为%23 输入构造好的payload http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/**/and/**/11%23 http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/*…...
UE4和C++ 开发-UE4怎么删除C++类
1 关闭visual stdio,关闭UE4引擎。 2 打开你的项目文件夹。找到你要删除的.h,.cpp文件删除。 3、删除Binaries文件夹。 4 右击.uproiect文件,点击Generate Visual Studio project files. 5 双击.uproiect文件,忽略警告打开就看到已经删除了想要删除的C类…...
基于图像识别的迁移学习之一
案例分析 加载数据部分同上一个案例,只需把数据输入到预训练的VGG-16或者ResNet50中。VGG-16的网络结构为右侧图绿色栏所示,其中block1中有2个包含64个卷积核的卷积层,block2包含2个128个卷积核的卷积层,block3有3个包含256个卷积…...
k8s使用
一、Kubernetes好处 kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。 kubernetes的本质…...
HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)
图片标签 HTML中,可以使用标签来插入图片。具体的语法为: <img src"图片路径" alt"替代文本">其中,src属性用于指定图片的路径,可以是相对路径或绝对路径。常见的有相对当前HTML文件的路径࿰…...
jwttoken+redis+springsecurity
思路 jwttoken不设置过期时间 redis管理过期时间,并且续签 redis中key"login:"userId, valuejwtUser 再次访问时,解析token中userId,并且根据过期时间自动续签JWT 实现登录认证 Token 自动续期方案 pom文件配置 <!--Redis--&…...
asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net 会议预约管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语 言开发 asp.net 会议预约管理系统 二、…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
