当前位置:首页 > 虚拟机 > 正文

哪类文件可以在java虚拟机中执行(java虚拟机是如何运行代码的)

JVM、JRE和JDK是什么意思?

JVM全称JavaVirtualMachine(Java虚拟机),是通过计算设备的规格在真实计算机上模拟各种计算机来实现的虚拟计算机功能。

Java运行环境(JRE)是由SunMicrosystems开发的软件。JRE允许您在计算机系统上运行Java应用程序(JavaApplication)。

JDK是一个Java语言软件开发工具包,主要用于移动设备和嵌入式设备上的Java应用程序。JDK是整个Java开发的核心,包括JAVA执行环境(JVM+Java系统类库)和JAVA工具。

JRE由两部分组成:JavaRuntimeEnvironment和JavaPlug-in。JavaRuntimeEnvironment(JRE)是一个允许您运行、测试和交付应用程序的Java平台,它包括Java虚拟机(jvm)和Java核心类。库和支持文件。

不包括开发工具(JDK)(编译器、调试器和其他工具)。JRE需要辅助软件JavaPlug-in才能在浏览器中运行applet。



扩展信息

Java平台包括:一样的。它分为两部分:Java虚拟机(Javavirtualmachine,JVM)和JavaAPI类库。Java虚拟机主要分为5大模块:类加载器子系统、运行时数据区、执行引擎、本地方法接口、垃圾收集模块。

垃圾收集模块尽管Java虚拟机规范并不要求进行垃圾收集,但大多数JVM实现在无限内存发明之前就已经进行了垃圾收集。

运行时数据区域以某种形式存在于每个JAVA虚拟机实例中,但它在Java虚拟机(JVM)规范中的描述非常抽象。这些运行时数据结构的许多细节是由特定实现的设计者确定的。

参考来源:-JVM

参考来源:-JRE

参考来源:-jdk

java虚拟机是如何工作的?

从宏观角度介绍了Java虚拟机的工作原理。一个原生编写的Java源文件(.java文件)是如何一步步实现的,如下。首先,Java源文件由前端编译器(javac或ECJ)编译为Java字节码文件。然后JRE将Java字节码文件加载到系统分配给JVM的内存区域中,然后执行引擎解释或编译类文件,然后编译器正好将字节码转换为机器代码。主要介绍下图中类加载器和运行时数据区两部分。(1)类加载是指将类的字节码文件(.class)中的二进制数据读取到内存中,放置到运行时数据区的方法区中,然后在其上创建一个对象堆栈。类的数据结构封装在方法区中。类加载的最终产品是位于堆栈上的类的对象。类对象将类的数据结构封装在方法区,并为JAVA程序提供访问方法区数据结构的接口。这是类加载器层次结构图。BootstrapClassLoader:在JVM运行时创建,负责加载存放在JDK安装目录下,或者-Xbootclasspath参数指定的路径下的jre\lib类文件,并且能够被虚拟机识别。(例如,所有以java.*开头的类都是由BootstrapClassLoader加载的)。初始化类不能被JAVA程序直接引用。扩展类加载器(ExtensionClassLoader):该类加载器负责加载JDK安装目录下的类\jre\lib\ext或系统变量指定的路径下的所有类库。开发者也可以直接使用扩展类加载器。应用程序类加载器(AppClassLoader):负责加载用户的类路径(Classpath)指定的类。开发者可以直接使用这个类加载器。如果应用程序没有定义自己的类加载器,则该类加载器是默认的类加载器。用户定义的类加载器(UserClassLoader):JVM自带的类加载器从本地文件系统加载标准的javaclass文件,自定义的类加载器可以在执行不可信代码之前自动验证数字签名。动态创建满足用户特定需求的自定义构造类,并从特定地方(数据库、网络)获取java类。注意,上面的类加载器不是通过继承实现的,而是通过组合实现的。JAVA虚拟机加载模式为委托模式,如上图步骤1-7所示。底部加载器可以看到顶部加载器中的类,但反之则不然。类加载器可以加载类,但不能卸载类。讲了很多,还是觉得有必要讲一些代码。首先,定义自己的类加载器MyClassLoader,它继承自ClassLoader,并重写父类的findClass(Stringname)方法,如下:使用指定的类加载器加载指定的字节码文件,如通过MyClassLoaderTest加载C:\\。Users\\Administrator\\下的class字节码文件,代码如下:(2)第一步是在运行时数据区加载字节码,接下来进行验证、准备、解析和初始化,然后具体进行的工作在步骤如下:(3)下面介绍运行时数据区,主要分为方法区、Java栈、虚拟机栈、本地方法栈和程序计数器。方法区,比如Java的堆,是每个线程共享的内存区域,而虚拟机堆、本地方法堆、程序计数器等都是线程私有的内存区域。Java堆:Java堆是Java虚拟机管理的最大一块内存。它由所有进程线程共享,并在虚拟机启动时创建。该区域的唯一目的是存储对象的实例。几乎所有对象实例都在这里分配内存。随着JIT编译器的发展和分支转义技术的逐渐成熟,栈分配、标量替换等优化技术使得堆上的对象分配内存不再那么“绝对”。Java堆是垃圾收集器管理的主要区域。由于当前收集器基本采用分代收集算法,因此Java堆也可以分为老年代和新生代(Eden、FromSurvivor、ToSurvivor)。根据Java虚拟机规范,Java堆可以驻留在物理上不连续的内存空间中,只要逻辑上连续即可。该区域的大小可以通过-Xmx和-Xms参数扩展。如果堆中没有内存来完成实例分配,并且堆无法扩展,则会抛出OutOfMemoryError异常。方法区:用于存储类信息、常量、静态变量、编译器及时编译的代码以及Java虚拟机加载的其他数据。与Java堆不同,Java虚拟机规范对方法区的限制非常宽松,你可以选择不实现垃圾收集。但这并不意味着数据进入方法区后就“永久”存在。该区域的内存回收目标主要是常量池回收和类型卸载。如果该区域没有足够的内存,则会抛出OutOfMemoryError异常。连续组:这个术语可能大家都很熟悉,它是方法区的一部分。类文件