企业网站的建设流程包含哪些环节?,西安汽车网站制作,wordpress 广告 统计,南京建设网站需要多少钱这篇文章#xff0c;我们来讲一下java的内存图及并发编程的预备内容。
首先#xff0c;我们来看一下下面的这两段代码#xff1a; 下面#xff0c;我们给出上面这两段代码在运行时的内存结构图#xff0c;如下图所示#xff1a; 下面#xff0c;我们来具体的讲解一下。…这篇文章我们来讲一下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类的实例即x1x2x3所以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程序在运行时的内存结构图然后稍微的提到了多线程。这些都是比较基础的都是要好好掌握。