并发编程——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 会议预约管理系统 二、…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...