《深入理解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虚拟机栈.本地方法栈 ...
随机推荐
- 测试调试-利用fiddler修改response返回结果
测试前端过程中,经常需要验证各种功能状态.不同数据层级等返回后的展示效果.一般会通过以下三种方式进行测试: 1.构造满足条件的测试数据:(耗时费力) 2.修改数据库:(前提需要了解数据库数据存储.沟通 ...
- ElasticStack学习(七):ElasticSearch之Mapping初探
一.Mapping的概念 1.Mapping类似于数据库中的Schema的定义,作用如下: 1)定义索引中的字段的名称: 2)定义字段的数据类型,例如字符串.数字.日期.布尔等: 3)对每个字段进行倒 ...
- 成功解决 org.mybatis.spring.MyBatisSystemException问题!!
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingExce ...
- 浅入深出Vue:代码整洁之封装
深入浅出vue系列文章已经更新过半了,在入门篇中我们实践了一个小小的项目. <代码整洁之道>一书中提到过一句话: 神在细节中 这句话来自20世纪中期注明现代建筑大师 路德维希·密斯·范·德 ...
- PG利用Multicorn访问CSV外部数据源
Multicorn 是一个 PostgreSQL 9.1+ 的扩展模块,用于简化外部数据封装开发,允许开发者使用 Python 编程语言开发. Install Multicorn Requiremen ...
- CSDN怎么一键转载别人的博客
在参考"如何快速转载CSDN中的博客"后,由于自己不懂html以及markdown相关知识,所以花了一些时间来弄明白怎么转载博客,以下为转载CSDN博客步骤和一些知识小笔记. 参考 ...
- Android 开发感想
18年从.net转行做安卓开发,现在已经过去一年多了.说一下感想和心得体会! 一.开始 说一下我的经厉,从毕业开始出来工作一直是从事.net方向的开发工作.一开始也是没什么经验,加上也没有其他手艺就找 ...
- [机器学习] k-近邻算法(knn)
最近在参加大数据的暑期培训,记录一下学习的东西. 引言 懒惰学习法:简单的存储数据,并且一直等待,直到给定一个检验数据,才进行范化,以便根据与存储的训练元组的相似性对该检验数据进行分类.懒惰学习法在 ...
- 个人永久性免费-Excel催化剂功能第49波-标准数据结构表转报表样式结果
中国的企业信息化,已经过去了20年,企业里也产生了大量的数据,IT技术的信息化管理辅助企业经营管理也已经得到广泛地认同,现在就连一个小卖部都可以有收银系统这样的信息化管理介入.但同时也有一个很现实的问 ...
- Cocos2d-x 3.x 学习笔记(6):Sprite SpriteFrameCache Texture2D TextureCache
1. 概述 TextureCache是对Texture2D纹理的缓存,SpriteFrameCache是对SpriteFrame的缓存,每个SpriteFrame是对Texture2D的封装,Spri ...