概念介绍:

![file](https://img2018.cnblogs.com/blog/1454321/202001/1454321-20200104145655999-149562495.jpg)

JVM运行时数据区:包含所有运行时所需要的数据和代码

方法区:存放所有类、常量、静态变量、编译后代码的内存区域(所有线程都访问该区域存储的信息,所以为线程共享部分)

堆内存:存放对象和数据的内存区域(所有线程都可以访问该区域的对象和数据,所以为线程共享部分,所有运行时创建的对象实例全部存放在此区域,运行时间久了需要的内存会越来越大,超出最大内存后出现OutOfMemroyError错误,所以需要垃圾回收器管理,清理不必要的内存)

本地方法栈: 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常 。 不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。(native方法不受java程序员控制,不需要关注)

程序计数器:记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空(CPU会执行多个任务,来回在不同任务之间进行切换,当线程执行到某一步还未执行完成切换后,待下次切换回该线程需要通过该位置恢复到正确的执行位置继续执行未完成的任务,而Native方法非java虚拟机执行,所以不需要记录计数器值)

虚拟机栈:线程执行代码所需要的空间,内包含栈帧,默认空间大小1M(一个方法对应一个栈帧,利用了栈数据结构“后进先出”的特性,先执行的方法后结束,后执行的方法先结束,无限递归或循环或许可以引发栈内存溢出StackOverflowError)

![file](https://img2018.cnblogs.com/blog/1454321/202001/1454321-20200104145656200-147511156.jpg)

局部变量:方法中定义的变量,方法对应栈帧,局部变量则对应方法中定义的变量

栈帧:每个方法执行所需要的局部变量、操作数栈、动态链接、方法返回地址、附加信息等(运行时将局部变量及操作压入栈中,需要运算时将相应的变量和操作出栈,运算完毕后入栈等待下一次运算,动态链接即为引用,引用局部变量对应存放在堆内存中的数据,方法返回地址即为对应堆内存地址,返回结果将存入此地址)

操作数栈:指令运算需要的栈空间(例如1+2,则会将1和2分别入栈,然后出栈做加法运算后将结果3继续入栈,以便后续使用)

![file](https://img2018.cnblogs.com/blog/1454321/202001/1454321-20200104145656373-38417636.jpg)

当我们需要运行一个java应用时,首先需要将java代码通过编译转换为java虚拟机可执行的字节码文件

![file](https://img2018.cnblogs.com/blog/1454321/202001/1454321-20200104145656542-1215232955.jpg)

接下来开始运行,以下我是对一个class字节码程序运行的理解:

1. 开启一个线程开始执行main方法,即开辟一块空间作为虚拟机栈,将main函数对应栈帧入栈

2. 按照字节码顺序将函数中局部变量和操作等依次放入操作数栈,执行对应操作后出栈

3. 若调用方法则继续将该方法对应栈帧入栈至虚拟机栈,然后同第2步执行,若该方法中还有调用方法则同第3步执行(依此类推,递归),全部指令执行结束后栈帧从虚拟机栈出栈(后进先出,在执行上层方法下一条指令前结束出栈)

4. 最后在main函数对应字节码指令全部执行完毕,从虚拟机栈出栈(先进后出),线程任务结束

如果喜欢,可点击右上角,或者直接扫描下方二维码进行关注哦

![file](https://img2018.cnblogs.com/blog/1454321/202001/1454321-20200104145656750-1138074885.jpg)

Java程序运行原理的更多相关文章

  1. Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗

    1. Java程序运行原理:     Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...

  2. Java程序运行原理分析

    class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时 ...

  3. Java 程序运行过程中的内存分析

    作为 java 程序员,都应该知道 Java 程序运行在 JVM(Java Virtual Machine,Java 虚拟机)上,可以把 JVM 理解成 Java 程序和操作系统之间的桥梁,JVM 实 ...

  4. [零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用

    Java Virtual Machine  官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...

  5. 基础知识《零》---Java程序运行机制及运行过程

    Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...

  6. linux(ubuntu) 搭建java程序运行环境

    一:简介 ubuntu 系统的和linux差不多,我们需要在系统上搭建java程序运行环境,需要安装jdk,mysql这两个软件,tomcat是绿色版,直接通过taz -zxvf tomcat 就可以 ...

  7. java 程序运行过程 简介

    这里的Java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时. 第一步,操作系统解析我们输入的java xxx命令, ...

  8. java程序运行时内存分配详解

    java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下   一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...

  9. Java程序运行时内存划分

    1.Java程序跨平台运行的原因 主要原因是:各种平台的JVM和字节码文件 Java源程序--具体平台的机器代码文件---被编译器翻译成平台无关的Class文件,又用特定JVM运行字节码文件,JVM在 ...

随机推荐

  1. 20-2 orm分组和聚合以及在项目中执行的一些方法

    一  orm分组和聚合 参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 1 表结构: # 第一张表 class Employee1(models ...

  2. oracle优化EXPORT和IMPORT

    使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度. ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.这个值至少要和表 ...

  3. Taglib自定义万能标签扩展 DownLoad

    http://www.thinkphp.cn/extend/538.html 用ThinkPHP的标签做网站觉得不够快速,就自己写了一个扩展,感觉挺好的,分享出来,给有需要的TPER. 复制代码 &l ...

  4. Pytorch使用GPU

    pytorch如何使用GPU在本文中,我将介绍简单如何使用GPU pytorch是一个非常优秀的深度学习的框架,具有速度快,代码简洁,可读性强的优点. 我们使用pytorch做一个简单的回归. 首先准 ...

  5. c++ 基本使用

    1 枚举 enum ShapeType { circle, square, rectangle }; int main() { ShapeType shape = circle; switch(sha ...

  6. 我来教你用AWS IoT.Part1--配置和接入

    AWS的IOT服务在中国区才开放.由于工作原因需要简单试用评估.写一下自己简单试用的流程,供其他人参考. 直接贴流程 1.先注册一个类型(这里“类型”相对于编程,可以理解为父类,里面可以添加一些可继承 ...

  7. java基本数据类型和包装类相互转换

    把基本数据类型 → 包装类: 通过对应包装类的构造方法实现 除了Character外,其他包装类都可以传入一个字符串参数构建包装类对象. 包装类 → 基本数据类型 包装类的实例方法xxxValue() ...

  8. 解决:javac: 无效的目标发行版: 1.8

    原 解决:javac: 无效的目标发行版: 1.8 2017年06月14日 16:21:12 代码也文艺 阅读数 44795 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  9. 如何读取redis中的key值中的结果

    redis的值有5种类型,不同的类型有不同的命令来获取: 字符直接 get key 队列 左端弹出一个元素  LPOP key 哈希 HGET key field 集合 SMEMBERS key 返回 ...

  10. java TCP传输

    两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流.该流中既有读取,也有写入. tcp的两个端点:一个是客户端,一个是服务端. 客户端:对应的对 ...