1、java语言的平台无关性。
因为java语言可以跑在java虚拟机上,所以只要能装java虚拟机的地方就能跑java程序。java语言以后缀名 .java为文件扩展名。通过java编译器javac编译成字节码文件.class 。java字节码文件通过java虚拟机解析运行。所以java语言可以说是编译解析型语言。
java虚拟机屏蔽了操作系统的特性。使java语言编译一次,就可以在任何装有符合版本的java虚拟机的操作系统上运行。准备的来说,应该是java的字节码文件是平台无关性的,而非java代码。
2、java类加载过程。
类加载过程分为加载、连接和初始化三个阶段,其中的连接阶段又分为验证、准备和解析三个阶段。
要执行 Class 文件就需要先将其加载进内存,这一工作正是由类加载器 (ClassLoader) 完成的,系统为我们提供了三种类加载器,分别是启动类加载器 (Bootstrap ClassLoader)、扩展类加载器 (Extension ClassLoader) 和应用程序类加载器 (Application ClassLoader),如果有必要,我们也可以加入自定义的类加载器。
3、java虚拟机内存结构。
Classloader 是 JVM 的一个子系统,用于加载类文件。每当我们运行 java 程序时,它首先由类加载器加载。Java中有三个内置的类加载器。
Bootstrap ClassLoader:这是第一个类加载器,它是扩展类加载器的超类。它加载包含Java标准版所有类文件的rt.jar文件,如java.lang包类、java.net包类、java.util包类、java.io包类、java.sql包类等。
Extension ClassLoader:这是 Bootstrap 的子类加载器和 System 类加载器的父类加载器。它加载位于$JAVA_HOME/jre/lib/ext目录中的 jar 文件。
System/Application ClassLoader:这是扩展类加载器的子类加载器。它从类路径加载类文件。默认情况下,类路径设置为当前目录。您可以使用“-cp”或“-classpath”开关更改类路径。它也被称为应用程序类加载器。
2.类(方法)区
Class(Method) 区域存储每个类的结构,例如运行时常量池、字段和方法数据、方法的代码。
3.堆
它是分配对象的运行时数据区。
4.堆栈
Java Stack 存储帧。它保存局部变量和部分结果,并在方法调用和返回中发挥作用。
每个线程都有一个私有 JVM 堆栈,与线程同时创建。
每次调用方法时都会创建一个新框架。框架在其方法调用完成时被销毁。
5.程序计数器寄存器
PC(程序计数器)寄存器包含当前正在执行的Java虚拟机指令的地址。
6.原生方法栈
它包含应用程序中使用的所有本机方法。
7.执行引擎
它包含了:
虚拟处理器
解释器:读取字节码流然后执行指令。
Just-In-Time(JIT) 编译器:用于提高性能。JIT 同时编译具有相似功能的部分字节码,从而减少编译所需的时间。这里,术语“编译器”是指从Java虚拟机(JVM)的指令集到特定CPU的指令集的翻译器。
8.Java 原生接口
Java Native Interface (JNI) 是一个框架,它提供了一个接口来与用另一种语言(如 C、C++、Assembly 等)编写的另一个应用程序进行通信。Java 使用 JNI 框架将输出发送到控制台或与 OS 库进行交互。