Java程序运行原理
概念介绍:

JVM运行时数据区:包含所有运行时所需要的数据和代码
方法区:存放所有类、常量、静态变量、编译后代码的内存区域(所有线程都访问该区域存储的信息,所以为线程共享部分)
堆内存:存放对象和数据的内存区域(所有线程都可以访问该区域的对象和数据,所以为线程共享部分,所有运行时创建的对象实例全部存放在此区域,运行时间久了需要的内存会越来越大,超出最大内存后出现OutOfMemroyError错误,所以需要垃圾回收器管理,清理不必要的内存)
本地方法栈: 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常 。 不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。(native方法不受java程序员控制,不需要关注)
程序计数器:记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空(CPU会执行多个任务,来回在不同任务之间进行切换,当线程执行到某一步还未执行完成切换后,待下次切换回该线程需要通过该位置恢复到正确的执行位置继续执行未完成的任务,而Native方法非java虚拟机执行,所以不需要记录计数器值)
虚拟机栈:线程执行代码所需要的空间,内包含栈帧,默认空间大小1M(一个方法对应一个栈帧,利用了栈数据结构“后进先出”的特性,先执行的方法后结束,后执行的方法先结束,无限递归或循环或许可以引发栈内存溢出StackOverflowError)

局部变量:方法中定义的变量,方法对应栈帧,局部变量则对应方法中定义的变量
栈帧:每个方法执行所需要的局部变量、操作数栈、动态链接、方法返回地址、附加信息等(运行时将局部变量及操作压入栈中,需要运算时将相应的变量和操作出栈,运算完毕后入栈等待下一次运算,动态链接即为引用,引用局部变量对应存放在堆内存中的数据,方法返回地址即为对应堆内存地址,返回结果将存入此地址)
操作数栈:指令运算需要的栈空间(例如1+2,则会将1和2分别入栈,然后出栈做加法运算后将结果3继续入栈,以便后续使用)

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

接下来开始运行,以下我是对一个class字节码程序运行的理解:
1. 开启一个线程开始执行main方法,即开辟一块空间作为虚拟机栈,将main函数对应栈帧入栈
2. 按照字节码顺序将函数中局部变量和操作等依次放入操作数栈,执行对应操作后出栈
3. 若调用方法则继续将该方法对应栈帧入栈至虚拟机栈,然后同第2步执行,若该方法中还有调用方法则同第3步执行(依此类推,递归),全部指令执行结束后栈帧从虚拟机栈出栈(后进先出,在执行上层方法下一条指令前结束出栈)
4. 最后在main函数对应字节码指令全部执行完毕,从虚拟机栈出栈(先进后出),线程任务结束
如果喜欢,可点击右上角,或者直接扫描下方二维码进行关注哦

Java程序运行原理的更多相关文章
- Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗
1. Java程序运行原理: Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...
- Java程序运行原理分析
class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时 ...
- Java 程序运行过程中的内存分析
作为 java 程序员,都应该知道 Java 程序运行在 JVM(Java Virtual Machine,Java 虚拟机)上,可以把 JVM 理解成 Java 程序和操作系统之间的桥梁,JVM 实 ...
- [零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用
Java Virtual Machine 官方介绍 Java虚拟机规范官方文档 https://docs.oracle.com/javase/specs/index.html 其中以java8的为 ...
- 基础知识《零》---Java程序运行机制及运行过程
Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...
- linux(ubuntu) 搭建java程序运行环境
一:简介 ubuntu 系统的和linux差不多,我们需要在系统上搭建java程序运行环境,需要安装jdk,mysql这两个软件,tomcat是绿色版,直接通过taz -zxvf tomcat 就可以 ...
- java 程序运行过程 简介
这里的Java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时. 第一步,操作系统解析我们输入的java xxx命令, ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
- Java程序运行时内存划分
1.Java程序跨平台运行的原因 主要原因是:各种平台的JVM和字节码文件 Java源程序--具体平台的机器代码文件---被编译器翻译成平台无关的Class文件,又用特定JVM运行字节码文件,JVM在 ...
随机推荐
- oracle函数 VSIZE(X)
[功能]返回X的大小(字节)数 [参数]x select vsize(user),user from dual; 返回:6 asdied select length('adfad合理') " ...
- python-字符编码数据类型转换
1 - 编码格式转换 1.1 编码格式介绍 字符集 介绍 ASCII ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符 ANSI ANSI是一种字符代码,为使计算 ...
- Python--day72--ajax简介
ajax的基本结构: <script> $("#b1").on("click", function () { $.ajax({ url: " ...
- PHP IF判断 简写
第一种:IF 条件语句 第二种:三元运算 第三种:&& .|| 组成的条件语句 第一种: IF 基础,相信绝大多数人都会: 第二种: c=a>b ? true:false / ...
- Django入门2--Django的应用和开发第一个Template
Django创建应用的命令: 应用的目录: 开发第一个Template:
- Codeforces Round #183 (Div. 2)
A. Pythagorean Theorem II 暴力,\(O(n^2)\). B. Calendar 每个日期计算到0年1月1日的天数,相当于转化成前缀和形式. 闰年数计算\[\lfloor\fr ...
- H3C 单区域OSPF配置示例一
- H3C 计算子网内可用主机地址数
- linux 阻塞 open 作为对 EBUSY 的替代
当设备不可存取, 返回一个错误常常是最合理的方法, 但是有些情况用户可能更愿意等待 设备. 例如, 如果一个数据通讯通道既用于规律地预期地传送报告(使用 crontab), 也用于根据 用户的需要偶尔 ...
- tab选项卡平滑滚动vue
<html lang="en"> <head> <meta charset="UTF-8"> <title>Ti ...