Java作为高级语言,高度抽象,无法直接运行在机器上,这样就必须设计一个面向Java语言特征的虚拟机,并通过编译器将Java程序转化成虚拟机所能识别的指令序列,也成Java字节码。

Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。Java 程序编译而成的 class 文件,需要先加载至方法区中,才能在 Java 虚拟机中运行。最左列是偏移;中间列是给虚拟机读的机器码;最右列是给人读的代码

0x00:  b2 00 02        getstatic java.lang.System.out

0x03:  12 03            ldc "Hello, World!"

0x05:  b6 00 04        invokevirtual java.io.PrintStream.println

0x08:  b1                  return

Java虚拟机如何运行Java字节码(HotSpot 虚拟机为例):

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

在运行时,当调用进入到方法时,虚拟机会在当前线程的Java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数(以解释器使用的解释栈帧为例,这种栈帧有两个主要的组成部分,分别是局部变量区,以及字节码的操作数栈。这里的局部变量是广义的,除了普遍意义下的局部变量之外,它还包含实例方法的“this 指针”以及方法所接收的参数)。当方法执行完之后(不管是正常退出还是异常退出),虚拟机均会弹出当前线程的当前栈帧,丢弃。

如果想让机器识别代码,还需要将字节码转化成机器码。

①解释执行:逐条将字节码翻译成机器码。无需等待,运行哪编译哪。

②即时编译:将一个方法中的所有字节码编译成机器码。提前编译完成,需要等待,实际运行速度快。

Hotspot采用了混合模式。先解释执行,将解释执行多的热点代码以方法为单位即时编译。

HotSpot 内置了多个即时编译器:C1、C2 和 Graal(Java10引入)。

java代码如何能运行起来_Java代码如何运行相关推荐

  1. java代码是怎么运行的_Java代码是如何运行起来的?

    目录 1.编译 写好:".java"代码后,会通过编译器将代码编译成.class后缀的字节码文件 Java是平台无关的,实现语言无关性的基础就是虚拟机和字节码存储格式 只要编译器按 ...

  2. 怎么用java构建哈夫曼树_Java代码构造哈夫曼树

    1.问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法.其压缩率通常在20%-90%之间.哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式.一个包含1 ...

  3. java dao层编写及注释_JAVA代码注释规范

    2. 班级: 班级的目的,即班级完成的功能,以及班级的创建时间和作者姓名:当多个人一次编辑或修改同一个班级时, 作者姓名中应出现多个姓名: 3. 接口: 在满足类注释的基础上,接口注释应包含设置接口的 ...

  4. java表盘时钟的设计思路_java代码实现时钟

    实现效果如图: Java代码: 文件一:ClockPanel.java importstaticjava.util.Calendar.HOUR;importstaticjava.util.Calend ...

  5. java中 复制到下一行_java代码复制到下一行

    java代码复制到下一行 [2021-02-10 13:04:40]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/( ...

  6. java 校验姓名只能包含中英文_java代码验证用户名,支持中英文(包括全角字符)、数字、下划线和减号 (全角及汉字算两位),长度为4-20位,中文按二位计数...

    package com.sangedabuliu.www; import java.util.regex.Matcher; import java.util.regex.Pattern; public ...

  7. java中怎么制作单选框_java代码swing编程 制作一个单选按钮的Frame

    不善于思考,结果费了时间,也没有效果 下面的框框可以做出来. package com.kk; import javax.swing.JFrame; import javax.swing.JLabel; ...

  8. java把控件跑挂了_Java代码动态修改 ConstraintLayout 内控件布局的辅助类

    ##上图 ConstraintUtil.java import android.support.annotation.IdRes; import android.support.constraint. ...

  9. java给txt文件写入内容_java代码 如何向TXT文件写入内容?

    展开全部 向txt文件写入内容基本思路就是获得一个62616964757a686964616fe59b9ee7ad9431333337613134file对象,新建一个txt文件,打开I/O操作流,使 ...

最新文章

  1. Navicat工具里的empty table和truncate table的区别
  2. laravel 5 自定义全局函数,怎么弄呢?
  3. java模块化发布选型_Java模块化开发
  4. C语言的那些小秘密之【内存分配】
  5. 七夕动态表白代码,基于python
  6. 读《亿级流量网站架构核心技术》
  7. UFO报表另存为Excel提示:可能没有正确安装Excel
  8. 南京师范大学计算机考研2021,南京师范大学2021考研分数线已公布
  9. 聊聊深度学习这档子事(3):寻找万能的通用模型
  10. element-ui表格头在分辨率较低的电脑会错乱
  11. 两个tplink路由器有线桥接_TP-Link路由器的有线桥接图解
  12. GestureDetector--手势识别初体验(一)
  13. Mac 切换 键盘布局(Colemak、dvorak、qwerty)
  14. 16,甲流疫情死亡率
  15. android 单点登录
  16. 【笔记】分布式系统核心问题概述(二)
  17. 启用计算机无线网络连接,无线网络连接未启用DHCP是怎么回事?如何解决?
  18. Write Week 3 Blog beforehand
  19. PRML之Approximate Inference
  20. 外网访问群晖NAS的方法,使用公网助手,怕自己忘记

热门文章

  1. [推荐]在线测试你的网速
  2. 从源码理解Redux和Koa2的中间件机制
  3. NET使用了UpdatePanel后如何弹出对话框!
  4. Linux系统起源及主流发行版
  5. API聚合网关技术选型参考-网友实战-使用协程
  6. 根据文件名或文件扩展名获取文件的默认图标
  7. post和get提交中文数据的转码问题
  8. java编译器 Javac 编译原理
  9. linux shell 文件路径 分解 解析 切分 ${str:a:b} 用法
  10. linux shell 字符串作变量名 间接变量引用