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在 ...
随机推荐
- @codeforces - 414E@ Mashmokh's Designed Problem
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵 n 个点的树,每个点的儿子是有序的. 现给定 m 次操 ...
- 模板—K-D-tree(P2479 [SDOI2010]捉迷藏)
#include<algorithm> #include<iostream> #include<cstdio> #include<cmath> #def ...
- Tenka1 Programmer Beginner Contest D IntegerotS(补)
当时没做出来,官方题解没看懂,就看别人提交的代码,刚对着别人代码调了几组数据,才发现,思路差不多,不过,原来是这样实现啊,果然我还是很菜 思路:题目要求是选取的这些数字全部进行OR运算,结果<= ...
- Python3:ImportError: No module named 'compiler.ast'
from compiler.ast import flatten 上面这条语句好像在python3 以后就废除了,如果使用的话就会报错.Traceback (most recent call last ...
- Educational Codeforces Round 10 A B题、
A. Gabriel and Caterpillar 题意: 就是说 一个小孩子去观察毛毛虫从 h1的地方爬到h2的地方.毛毛虫从10点爬到22点.每小时爬的距离是a, 晚上22点到第二天早上10点 ...
- 本地安装配置redis
Windows中redis的下载及安装.设置 本文是转载自:https://www.cnblogs.com/jylee/p/9844965.html 下载地址: https://github.co ...
- java 操作流的步骤
File类本身是与文件操作有关,但是如果要想操作内容则必须使用字节流或字符流完成,但是不管是使用何种的输入输出流,其基本的操作原理是一样的(以文件流为准): 一.使用File类找到一个文件对象,得到I ...
- P1089 过独木桥
题目描述 今年的 CSP-J/S 比赛马上就要开始了,代码决定的 N 位女学生排队去参加比赛. 期间他们遇到了代码决定的 M 位男生组成的男生队伍. 他们堵在了一座独木桥前.但是独木桥每次只能过一个人 ...
- slot的使用方法
参考链接:https://www.cnblogs.com/loveyt/p/9946450.html 插槽的使用其实是很简单,你只需明白以下两点,就很容易理解. 1.插槽是使用在子组件中的, 2.插槽 ...
- 原生js添加鼠标事件的兼容性写法
兼容pc和移动端,还兼容了surface平板. surface平板特别坑,既可以用鼠标也能用触摸屏,也就是说同时有touch事件和mouse事件. function addEvent(_target, ...