程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

JVM篇-JVM加载字节码文件(.class)原理

发布于2021-06-14 10:08     阅读(401)     评论(0)     点赞(12)     收藏(2)


首先要知道JVM是啥

JVM就是在计算机上再虚拟一个计算机,和VMWare不一样,VMWare你是可以看到的,而JVM你是看不到的,它存在内存中。计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个JVM 也是有这成套的元素,运算器是当然是交给硬件CPU 还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集,这与汇编的命令集有点类似,每一种汇编命令集针对一个系列的CPU ,比如8086 系列的汇编也是可以用在8088 上的,但是就不能跑在8051 上,而JVM 的命令集则是可以到处运行的,因为JVM 做了翻译,根据不同的CPU ,翻译成不同的机器语言。

总之,JVM 是可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件,我们写的所有类、常量、变量、方法都在内存中,因此JVM决定着我们程序运行的是否健壮、是否高效。

为什么说Java语言是跨平台的呢?
因为针对不同的操作系统,有不同的JVM规则来映射,Java源程序就与操作系统无关了。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。
在这里插入图片描述

其次知道JVM的组成

在这里插入图片描述
类加载器的作用是加载类文件到内存。Class Loader 只管加载,只要符合文件结构就加载。
至于能不能运行:执行引擎也叫做解释器(Interpreter) ,负责解释命令,提交操作系统执行。
本地接口的作用是融合不同的编程语言为Java 所用,它的初衷是融合C/C++ 程序。。在内存中专门开辟了一块区域处理标记为native 的代码,它的具体做法是Native Method Stack 中登记native 方法,在Execution Engine 执行时加载native libraies 。
运行数据区是整个JVM 的重点。我们所有写的程序都被加载到这里,之后才开始运行。详情见java内存结构。

再来看加载class文件的原理

JVM中类的装载是由ClassLoader和它的子类来实现的,类装载器是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,大部分都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。
(1)隐式装载,程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,
(2)显式装载,通过class.forname()等方法,显式加载需要的类 ,隐式加载与显式加载的区别:两者本质是一样的。
Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

部分内容参考博客与书籍。如有侵权,立刻删除。

原文链接:https://blog.csdn.net/luodaxia_ttt/article/details/117719235



所属网站分类: 技术文章 > 博客

作者:niceboty

链接:http://www.javaheidong.com/blog/article/222781/c623342ab74c897f9cb9/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)