java虚拟机

相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的。

那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM)

JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。

而这个过程中,我们编写的Java程序没有做任何改变,仅仅是通过JVM这一”中间层“,就能在不同平台上运行,真正实现了”一次编译,到处运行“的目的。

JVM是一个”桥梁“,是一个”中间件“,是实现跨平台的关键,Java代码首先被编译成字节码文件,再由JVM将字节码文件翻译成机器语言,从而达到运行Java程序的目的。

注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。

所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行。即使你将Java程序打包成可执行文件(例如 .exe),仍然需要JVM的支持。

注意:跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。


关于JVM的执行效率

Java 推出的前几年,人们有不同的看法,解释字节码肯定比全速运行机器码慢很多,牺牲性能换来跨平台的优势是否值得?

然而,JVM 有一个选项,可以将使用最频繁的字节码翻译成机器码并保存,这一过程被称为即时编译。这种方式确实很有效,致使微软的 .NET 平台也使用了虚拟机。

现在的及时编译器已经相当出色,甚至成了传统编译器的竞争对手,某些情况下甚至超过了传统编译器,原因是JVM可以监控运行时信息。例如,即时编译器可以监控使用频率高的代码并进行优化,可以消除函数调用(即“内嵌”)。

但是,Java 毕竟有一些C/C++没有的额外的开销,关键应用程序速度较慢。比如Java采用了与平台无关的绘图方式,GUI程序(客户端程序)执行要慢;虚拟机启动也需要时间。

客户端市场的折戟

Java 的GUI库称不上出色,界面不算友好,大部分用户不太习惯;Java 的客户端资源消耗也比较大,大数据量的应用和功能复杂的应用性能堪忧。

更加不能接受的是,微软因自身利益和SUN分家后,Windows 便不再预装JVM了,用户安装你的程序之前,必须要安装JVM并正确设置,你可以要求普通用户安装你的软件,但是你能期望他了解JVM的有关知识并正确安装设置吗?

虽然你可以将JVM集成在你的程序中,自动安装并设置,不让用户干预,但是你希望附带一个比你的程序还要大好多的JVM吗?一个软件这样做或许可以接受,成千上万个软件都这样做,那用户要安装多少个JVM?磁盘空间要浪费多少?

所以,直接投放市场的面向普通用户的客户端程序,用Java开发的很少,大部分Java开发的客户端是给企业内部员工使用,员工领到电脑时,技术部已经给配置好了。如果你希望从事客户端开发,建议学习 C/C++ 和 .NET,它们在Window客户端开发方面有较大的优势。

种种原因,注定了Java客户端不利于推向市场,让普通用户接受。不过话又说回来,客户端开发也不是Java的初衷,Java最初是面向嵌入式的,却随着互联网的兴起而快速成长,在Web开发上大显身手。

### Java虚拟机原理与使用指南 #### Java虚拟机的基本概念 Java虚拟机(JVM)是一个抽象的计算机器,它通过软件模拟来实现,具有自己的硬件组件,如处理器、堆栈、寄存器以及指令系统。这种设计使得Java程序能够在任何支持JVM的平台上运行,而无需考虑底层硬件的具体实现[^2]。 #### Java虚拟机的工作原理 Java程序的执行过程可以分为几个关键步骤。首先,Java源代码(.java文件)被编译器转换为字节码(.class文件)。这些字节码文件随后被加载到JVM中,并由JVM负责解释执行或即时编译为本地机器码执行。这一过程的关键在于JVM能够将相同的字节码文件在不同的平台上转换为适合该平台的机器指令,从而实现了Java语言的跨平台特性[^2]。 #### Java虚拟机的主要组成部分 JVM由多个子系统组成,其中包括类加载器子系统、运行时数据区、执行引擎等。其中,类加载器子系统负责加载类文件到JVM中,具体包括加载、链接和初始化三个阶段。运行时数据区则包括方法区、堆、栈、程序计数器等部分,它们各自承担着不同的职责。执行引擎负责执行字节码指令,它可以通过解释执行或者使用即时编译技术来提高性能[^4]。 #### Java虚拟机的内存管理 JVM的内存管理是其核心功能之一,它自动处理内存分配和垃圾回收。堆是JVM管理的最大一块内存空间,主要用于存储对象实例。方法区用于存储已被虚拟机加载的类信息、常量池、静态变量等数据。此外,每个线程私有的程序计数器、Java虚拟机栈和本地方法栈也都是JVM内存管理的重要组成部分。垃圾回收机制负责自动回收不再使用的对象所占用的内存空间,从而减轻了开发者的负担[^4]。 #### Java虚拟机的安全性和线程管理 JVM提供了一套完整的安全机制,包括字节码验证、类加载器机制、访问控制等,确保了Java程序的安全性。同时,JVM还支持多线程编程模型,允许开发者编写并发程序,利用多核处理器的优势提高程序性能。JVM内部实现了线程调度、同步机制等功能,使得多线程程序的开发更加简便[^4]。 #### Java虚拟机的优化与实战 为了提升Java应用程序的性能,JVM提供了多种优化手段,包括但不限于即时编译优化、内存分配与垃圾回收策略优化等。开发者可以通过调整JVM参数来优化应用性能,例如设置堆大小、选择合适的垃圾收集器等。此外,深入理解JVM的工作原理有助于开发者更好地编写高效、稳定的Java程序[^1]。 ```java public class JVMDemo { public static void main(String[] args) { // 示例代码:创建一个简单的Java对象 Person person = new Person("John Doe", 30); System.out.println(person.getName() + " is " + person.getAge() + " years old."); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值