《深入理解Java虚拟机》-Java代码是如何运行的
问题一:Java与C++区别
1.Java需要运行时环境,包括Java虚拟机以及Java核心类库等。
2.C++无需额外的运行时,通常编译后的代码可以让机器直接读取,即机器码
问题一:Java为什么要在虚拟机运行?
1.一次编译,到处运行。
这里涉及到一个概念:字节码。
Java字节码指的是设计一个面向Java特性的虚拟机,通过编译器将Java程序转换成该虚拟机所能识别的指令序列。
为什么是叫字节码呢?原因还是Java 字节码指令的操作码(opcode)被固定为一个字节。
2.托管环境。
虚拟机能够代替我们处理一些代码中冗长而且容易出错的代码的部分,比如C++中经常出现的垃圾回收问题,程序员经常忘记回收垃圾。
另外,虚拟机还为我们提供了如数组越界,动态类型等动态检测,极大地降低了Java开发的难度。
问题二:Java虚拟机具体是如何运行Java字节码的?
以Hotspot虚拟机为例子,Java虚拟机细分为方法区、堆、Java方法栈、面向本地方法的本地方法栈、PC寄存器
从虚拟机的视角看,
1.执行Java代码首先需要将它编译成class文件加载到Java虚拟机中,加载后的Java类会被保存到方法区中。实际运行时,虚拟机会执行方法区中的代码。
2.上图中的堆和栈是用来存储运行时数据的。其中,栈被分成了面向Java方法的Java方法栈和面向本地方法(C++写的native方法)本地方法栈,以及存放各个线程执行位置的PC寄存器
3.在运行过程中,每当调用一个方法,虚拟机就会在当前线程的Java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。当方法执行完毕之后,该栈帧也随着被弹出。
从硬件角度看,
在HotSpot里面,编译Java代码有两种方式,一种是解释执行,另一种是编译执行。
解释执行:逐条将字节码翻译成机器码并执行(边翻译边读)
编译执行:将一个方法中包含的所有字节码编译成机器码之后执行。(翻译完之后,再读)
前者优势在于:无需等待编译完全
后者优势在于:热点代码比较多的时候,读取的执行效率快于前者。
HotSpot使用的是多个即时编译器共同协作:C1,C2,和Java10正式使用的Graal。
参考文章:《极客时间》-https://time.geekbang.org/column/article/11289
《深入理解Java虚拟机》-Java代码是如何运行的的更多相关文章
- 深入理解java虚拟机---java虚拟机内存管理(七)
本地方法栈.java堆.方法区 本地方法栈在HotSpot版本内与java虚拟机栈是合二为一的.不单独区分本地方法栈.但是java虚拟机中是有这样一块区域的. 作用: 1.本地方法栈为虚拟机栈执行ja ...
- 深入理解java虚拟机---java虚拟机内存管理(六)
java虚拟机栈的理解 虚拟机栈就是我们所熟知的栈内存,栈内存属于线程独有的.而在栈内存中的局部变量表中存储的引用类型只是存储对象的内存地址.对象的创建在堆内存中,即对象在线程共享区中. 局部变量表: ...
- 深入理解Java虚拟机 - Java体系
使用JAVA已经快三年了,但说来惭愧,一直以来认为Java就是Java语言本身,最多再包括一个JVM,对于整个Java的体系结构还是不甚明了,现在有时间把<深入理解Java虚拟机>这本书读 ...
- 深入理解java虚拟机---java虚拟机内存管理(五)
1.深入理解java虚拟机 总图: 1.线程共享区: 2.线程独占区: 1.程序计数器 理解为当前线程锁执行的字节码的行号指示器,程序计数器没有内存异常错误.
- 深入理解java虚拟机----java技术体系(一)
1.java技术体系 举例: class文件格式:如下图所示,java源代码可以根据不同的编译器可以编译成不同的代码.即可以自定义语言规范比如beanshell,并编写代码; 然后自己编写java编译 ...
- 深入理解java虚拟机---java内存区域与内存溢出异常---1内存结构
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- 深入理解java虚拟机---->java内存区域与内存溢出异常
2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...
- 深入理解java虚拟机---java虚拟机的发展史(四)
1.java虚拟机 A:java虚拟机有很多个版本,但是我们经常使用的是sun公司的HotSpot,可以通过以下命令获取java虚拟机版本 B:JAVA虚拟机分类: 1.Sun Class VM 2. ...
- Java虚拟机——Java内存区域
1.运行时区域 Java虚拟机在执行Java程序的时候会把它管理的内厝划分为若干个不同功能的数据区域,如图所示 首先是程序计数器,程序计数器可以理解为当前程序执行的字节码的行号指示器,计数器中的数据即 ...
- Java虚拟机——Java内存区域与内存溢出
内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈 ...
随机推荐
- flask 请求上下文源码(转)
本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...
- c# override用法
要扩展或修改继承的方法.属性.索引器或事件的抽象实现或虚实现,必须使用 override 修饰符. 在此例中,类 Square 必须提供 Area 的重写实现,因为 Area 是从抽象的 Shapes ...
- Leetcode 195 Tenth Line
Given a text file file.txt, print just the 10th line of the file. Example: Assume that file.txt has ...
- Linux命令学习-mv命令
Linux中,mv命令的全称是move,主要作用是移动文件或文件夹,类似于Windows下的剪切功能,同时还可以用于修改名字. 假设当前处于wintest用户的主目录,路径为 /home/wintes ...
- Bzoj 3165 [Heoi2013]Segment题解
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 668 Solved: 276[Submit][Sta ...
- 番外:深浅copy
进击のpython 深浅copy copy是什么意思? 复制 (又学一个单词!开不开森) 那啥叫复制呢? 百度百科上给的解释是:仿原样品制造 我们曾经有过这样的印象 a = "zhangsa ...
- VSCode 云同步扩展设置 Settings Sync 插件
VSCode 云同步扩展设置 Settings Sync 插件 Hi.大家好,今天又是美好的一天. 关于 Settings Sync扩展: Settings Sync可以同步你当前的VSCode配置环 ...
- NetCore 依赖注入之服务之间的依赖关系
简单介绍,直接官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?view=aspn ...
- [Spring-Cloud-Alibaba] Sentinel 整合RestTemplate & Feign
Sentinel API Github : WIKI Sphu (指明要保护的资源名称) Tracer (指明调用来源,异常统计接口) ContextUtil(标示进入调用链入口) 流控规则(针对来源 ...
- npm-472错误
今天无聊给npm进行了一波升级,却没想到导致出现bug,搞了半天才解决了....这里进行一下分享 1.安装npm npm install -g 升级到最新版npm install -g npm@< ...