前言

Java不同于C、C++,运行C++时只需将源代码编译成CPU所能理解的机器码即可。然而,Java需要在Java虚拟机中运行,将Java源代码编译成虚拟机能识别的字节码(即.class文件)。

当一项事情变得几乎不可能时,使用中间件(Java虚拟机)让这件事变成可能。

Java虚拟机

虚拟机如何执行Java代码

从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于**方法区(Method Area)**中。实际运行时,虚拟机会执行方法区内的代码。

在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。

当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。

Java虚拟机以方法作为最基本的执行单元,“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址和一些额外的附加信息。

内存划分

Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。Java 程序编译而成的 class 文件,需要先加载至方法区中,方能在 Java 虚拟机中运行。

线程私有:程序计数器、本地方法栈、虚拟机栈
线程共享:堆、方法区(类型信息、静态变量、字符串常量池)

1.方法区

方法区用来存储解析被加载的class文件的相关信息。

当虚拟装载一个class文件后,它会从这个class文件包含的二进制数据中解析类型信息,然后将该相关信息存储到方法区中。

2.堆

堆是用来存储相关引用类型的,如new对象。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

3.PC寄存器

PC寄存器主要用来存储线程。当新创建一个线程时,该线程都将得到一个自己的PC寄存器(程序计数器)以及一个java栈。

Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。

4.栈区

栈区主要用来存储值类型的,如基本数据类型。需要注意的是,String为引用类型,是存在堆中的。

Java栈是由许多栈帧组成的,一个栈帧包含一个Java方法调用的状态,当线程调用一个方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧从Java栈中弹出。

JDK1.6,永久代是HotSpotVM的方法区的一种实现


JDK1.7中,将1.6中永久代的字符串常量池和静态变量等移动到了堆中
JDK1.8完全放弃了“永久代”,改用了在本地内存中实现的“元空间”,将1.7中永久代剩下的部分(主要是类型信息)移动到了元空间。

执行步骤

参考文档:
https://www.cnblogs.com/zenghansen/p/15618536.html


运行时数据区为执行引擎提供了执行环境和相关数据,执行引擎通过与运行时数据区交互,从而获取执行时需要的相关信息,存储执行的中间结果等

当要执行本地方法时,执行引擎将调用本地方法接口来获取相关OS本地方法。

Java代码如何运行的?相关推荐

  1. java代码如何运行?

    前言 作为一名Java程序员,我们需要知道Java代码是怎么运行的.最近复习了深入理解Java虚拟机,做了一下总结,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激不尽. java 代码运行主要流 ...

  2. 循环队列真的没那么难,就那么几个注意点,附Java代码及运行效果

    1. 队列 队列是一种常见的线性数据结构,满足先进先出(First In First Out),简称为FIFO,第一次看到FIFO还以为是单片机的输出输出什么的,见笑了.数据结构不太了解的话可以看看我 ...

  3. java main函数_一行JAVA代码如何运行起来?

    在程序员的世界中,你总会听到一句"PHP是世界上最好的语言"的调侃.然而在你进入软件程序开发之后,你会发现即使开发语言千千万,最盛行的还是JAVA.从淘宝的技术变迁中我们可以见一些 ...

  4. 【剧前爆米花--爪哇岛寻宝】初识Java,了解Java代码的运行机制及JDK,JRE,JVM等

    作者:困了电视剧 专栏:<JavaSE语法与底层详解> 文章分布:这是一篇知识点较为基础的文章,我会先将JavaSE相关的知识给罗列一遍,然后在后续的文章中会对其中重要的点再逐一进行底层剖 ...

  5. 【Java】获取Java代码段运行毫秒数的策略

    System.currentTimeMillis() 使用System.currentTimeMillis(),获取系统当前时间(按ms计量),类型为long. 在测试代码段开始前打上第一个时间戳,使 ...

  6. java代码的运行顺序_java中的代码块执行顺序

    输入代码 blic static void main(String[] args) { { int x = 10;//限定变量的声明周期 System.out.println(x); } Studen ...

  7. 玫瑰花Java代码怎么运行出来_玫瑰花Java web程序

    玫瑰花Java web程序 有兴趣的同学可以参考一下 Java类RoseController package com.spring.controller; import java.io.Buffere ...

  8. 【Java代码的运行过程】 ——每天一点小知识

  9. Java程序员必备基础:Java代码是怎么运行的?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:一个线程池 bug 引发的 GC 思考!个人原创+1博客:点击前往,查看更多 链接:https://segmen ...

最新文章

  1. 【内网福音】如何离线部署Rancher
  2. phpstudy php日志,phpstudy开启网站Apache日志并且按照日期划分创建
  3. Spring data jpa 条件查询-按时间段查询
  4. 如何接受上级指令_向上级领导汇报工作是经常的,想得赏识,了解如何接受上级的命令...
  5. Golang协程goroutine和管道channel结合案例
  6. iOS隐藏键盘的几种方式
  7. C#与matlab混合编程
  8. Sphinx/Coreseek 4.1 跑 buildconf.sh 一个错误,无法生成configure档
  9. 初识Spring Boot
  10. Linux下的 API Hook
  11. 《解读量化投资:西蒙斯用公式打败市场的故事》内容简介及PDF下载
  12. 【JS】Unicode编码
  13. oppoR9s计算机使用方法,oppor9s怎么进入Recovery模式
  14. 区块链技术介绍PPT
  15. mPush实战笔记4安装mpush
  16. 基于微信小程序的高校课堂教学管理系统#毕业设计
  17. 电脑用户没有admin权限,如何配置node开发环境
  18. 在英特尔独立显卡上训练TensorFlow模型
  19. 【k-匿名(k-Anonymity)代码实现】差分隐私代码实现系列(三)
  20. 维度建模和范式建模对比

热门文章

  1. 第六章 彩色图像处理
  2. ps常用快捷键(二)
  3. 查找和排序方法归类----C和C++
  4. 自动驾驶:道路交通领域的范式革命,交通强国建设的引擎
  5. 痞子衡嵌入式:语音处理工具pzh-speech诞生记(6)- 文语合成实现(pyttsx3, eSpeak1.48.04)...
  6. mysql gbk排序规则_Mysql 字符集及排序规则
  7. matlab-高数 diff 方向导数
  8. 怎么写竞品分析报告(思路):
  9. 你以为 CSS 只是个简单的布局?
  10. 计算机驱动有必要更新,我们平时电脑的驱动需要一直更新吗?教你如何正确的维护你的驱动...