Java 运行原理

http://blog.csdn.net/bingduanlbd/article/details/8332664  (java不错)

在研究Java运行原理之前,我们先把视野放宽一点:一般的高级语言是如何工作的?我们在编辑器或者IDE里根据每种语言的语法规则敲入源代码,这些代码我们很容易理解。很显然,这些代码肯定是以二进制存储在我们的硬盘当中,当我们再次打开的时候,编辑器读取这些二进制,还原成我们能读懂的英文。当我们真正运行程序的时候,CPU是读不懂这些英文的,所以我们需要先转化成可执行的二进制文件,这个过程通常由编译器完成。有些编译器直接将源代码编译成机器码,载入内存后CPU可以直接运行。而机器码的格式是跟具体的CPU架构相关的,Intel的CPU机器码对于ARM CPU来说是无法理解的。因此,同样的源代码需要根据不同的硬件进行特定的编译。好了,高级语言到低级语言的桥梁就是编译器。我们写好源代码,编译器将源码编译成可执行的机器码,然后CPU读取机器码,执行程序。

可以说,Java这一语言的执行过程也遵循这样的过程:源代码--->机器码。 但是,从源代码到机器码之间,究竟经过什么样的过程,则是Java独一无二的了。宽泛地讲,Java源代码(.java)经过java编译器(javac.exe)编译之后,并没有直接转化为机器码,而是转化成一种中间格式,成为字节码(.class),字节码再经过java虚拟机转化成特定CPU架构的机器码。也正是因为这一中间物,java才有所谓的跨平台。在windows平台上编译好的字节码,copy到linux平台后,经过为linux而设计的Java虚拟机解释后即可执行。跨平台这一特征,是通过字节码和JVM来实现的。因此,想搞清楚java程序到底是如何运行的,重点在于弄明白字节码是如何被转化成跟CPU架构相关的机器码然后被执行的。也就是要理解JVM到底是如何工作的。

在了解JVM之前,我们再跳出来一下,先看看什么是虚拟机。所谓虚拟机,我是这么理解的:用软件的方式模拟出跟硬件类似的环境,比如说寄存器、存储器等等。当然,所有最终的工作还是由原来的CPU来完成。比如说VirtualBox这个虚拟机产品,它其实就是一个应用程序,用某种编程语言编写的应用程序。当运行这个应用程序时,它会要求操作系统给它独立施展手脚的空间:给我一些内存,给我一定的CPU时间片,然后不用管我了。你可能会问,寄存器是硬件啊,它怎么能划分啊,难道是时间划分?不是的,像内存这样的硬件,可以给虚拟机一块独立的内存块,但是寄存器之后的,则需要用“模拟仿真”的方式来模拟。OK,回到Java虚拟机。到底什么是Java虚拟机,很难有一个十分明确的定义,狭窄一点说,它就是一个应用程序,大部分用C++编写的。宽泛地说,它就是执行字节码的一整个环境。

从上面这一张图可以看出来,JVM完成了字节码带机器码的所有相关工作。它从文件系统中将字节码文件载入到操作系统分配给Java虚拟机的内存当中,然后解释字节码,转化成机器码,然后经由操作系统到达CPU运行。整个执行过程如下图所示:

至于java虚拟机到底是如何实现,如何工作的,则是一片值得研究的广阔天地。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据魔术师

数据技术|十分钟教会你写网络爬虫程序

写在前面 临近双11,小伙伴们都开始忙着剁手了。蛋是,这个学习还是不能落下的。那么,今天小编又给大家带来什么好玩的玩意儿呢? 那自然是 神奇&&牛掰 爬虫技术 ...

1.1K110
来自专栏后端技术探索

纯干货!-- Memcache详解

网址:http://www.cnblogs.com/xrq730/p/4948707.html

8420
来自专栏逢魔安全实验室

DedeCMS任意用户密码重置漏洞

综述 2018年01月09日,Dedecms官方更新了DedeCMS V5.7 SP2正式版,后续在10日有网友爆出其存在任意用户密码重置漏洞。...

35430
来自专栏IT派

Python 新功能:或将允许安全工具查看运行时操作

针对 Python 编程语言的新功能提议之一是希望为运行时添加“透明度”,并让安全和审计工具查看 Python 何时可能运行潜在危险的操作。

10820
来自专栏非典型程序猿

Elasticsearch数据更新全方位解析

前段时间在项目的crm存储部分,为了满足大量自定义的搜索功能,选择了使用了ES作为后端存储介质。

3.3K120
来自专栏cloudskyme

jbpm5.1介绍(4)

eclipse插件 需求 Eclipse的3.6或更新版本 Graphiti框架,使用更新站点 可以直接下载更新Graphiti http://downloa...

36760
来自专栏后端技术探索

纯干货!-- Memcache详解

网址:http://www.cnblogs.com/xrq730/p/4948707.html

19610
来自专栏用户1191492的专栏

JClouds的命令行界面

我已经使用JCloud(一种面向Java支持多种云的工具集)一年了。到目前为止,我已经在很多领域广泛地使用了JCloud,特别是在Fuse Eco...

33090
来自专栏FreeBuf

揭秘基于注册表隐藏的无文件攻击

*本文原创作者:ArkTeam 发展 一直以来,文件是恶意代码存在的最常见形式,安全软件也通常把磁盘上的文件作为重点检测对象。然而,一旦恶意代码以无文件形式存...

29550
来自专栏FreeBuf

分析一个跨平台DDOS僵尸网络

从最近“恶意软件必须死”的帖子了解到一些关于DNS放大攻击相关的LINUX恶意软件样本。我对linux恶意软件的研究非常感兴趣,而且这个很特别,因为他有一个DD...

26480

扫码关注云+社区

领取腾讯云代金券