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在 ...
随机推荐
- tf.cast用法
tf.cast:用于改变某个张量的数据类型 例如: import tensorflow as tf;import numpy as np; A = tf.convert_to_tensor(np.ar ...
- 对比MySQL,一文看透HBase的能力及使用场景
MySQL + HBase 是我们日常应用中常用的两个数据库,分别解决应用的在线事务问题和大数据场景的海量存储问题. 本文内容适合初次理解HBase的读者,包括技术.功能及场景,也欢迎老司机们补充和温 ...
- eclipse maven项目导出所使用的jar包
在eclipse中定位到maven项目的pom.xml文件右击pom.xml文件,选择Run As-->Maven build…在打开的页面中,GOLAS栏输入“dependency:copy- ...
- python深浅copy和赋值
Python直接赋值,浅copy和深copy的比较 基于引用和对象(python引用和对象分离) 总结: 直接赋值:a = b -->a,b两个引用指向相同的对象 浅copy:a为b的copy ...
- webpack学习(四)配置plugins
1 plugins是什么??? 如果学过vue和react肯定知道生命周期函数,而生命周期函数实际上就是当程序运行在某个时刻一定会发生的函数. plugins其实也是如此,我们在项目中配置相应的plu ...
- Vue递归菜单
一.效果图: 二.代码(Vue Cli 快速原型开发) App.vue <template> <div id="app"> <template v-f ...
- UVA 11922 Permutation Transformer —— splay伸展树
题意:根据m条指令改变排列1 2 3 4 … n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部 分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘 ...
- java 使用反射操作字段
Field提供两组方法操作字段: xxx getXxx(Object obj):获取obj对象该Field的字段值,此处的xxx表示8个基本数据类型.若该字段的类型是引用数据类型则使用,Object ...
- UVa 10603 Fill [暴力枚举、路径搜索]
10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...
- windows服务器运维日常--防火墙打开后ping不通
1. 打开防火墙,有利于安全 2. 添加80端口,支持互联网访问:添加3389端口,以支持远程桌面连接 3. 发现开了防火墙之后,ping不通网址www.mjywxy.xin 4. 查找资料和测试发现 ...