A)性能
如前所述、解释Java字节码比相当的C或C++写的程序运行起来要慢5到10倍。对一些并非受制于CPU的嵌入系统来说,这一个性能缺点不是问题,但是更经常的较慢的速度会导致无法接受的应答时间。有几种可能的解决方案可缓解速度慢的问题。
1)使用更快、更强大的处理器,使系统响应时间缩小到可以接受的范围。这个方法将增加每个系统的成本。
2)使用母语Java编译器来获得比较好的性能。但这样做,你就放弃了与Java平台无关的优点,好在大多数嵌入系统都只在一种平台上运行。
3)在你的系统上并入一个JIT编译器,这样Java类装入时就被编译。若你为接纳JIT编译器而不得不增加额外的内存,这个方法也会增加系统成本。另外,若你的系统各部分是按需求逐渐添加,你应控制程序装入的时机,以使在装入类进行编译时产生的暂停不会影响系统的响应时间。
B)垃圾收集的系统开销
前面论述过,Java中的自动内存分配和垃圾收集性能是实惠的,因为它去掉了最通常的程序错误根源并简化了程序设计人员的工作。但是,从实时系统的角度来看,它的问题恰好就在于它是自动的。当垃圾收集进行时,你的控制就受限了。
垃圾收集运行时,它冻结了系统其余部分的处理。这是因为它必须要在内存中移动对象,并必须在程序再次运行前,更新所有引用(指向)那些对象的程序变量。垃圾收集能冻结处理达数十分之一秒,具体取决于内存量和处理器的速度。很显然,这对硬实时系统是无法接受的,甚至极端时对软实时系统也是成问题的。
垃圾收集以三种方式开启。首先JVM有一个后台垃圾收集线程,此线程倾向于在它一看见系统有空闲就开始垃圾收集,若有事件想要唤醒另一个线程,后台垃圾收集就会被该线程占先,但它不会立刻被占先,它得更新那些已被移动得对象的所有引用后,才能让一个线程运行。
其次,若JVM没找到足够内存来满足某个内存分配请求,它将启动一个不会被占先的垃圾收集,在该操作完成之前,系统的其余部分被禁止。
最后,一个应用程序能通过调用Systev.gc()方法来启动垃圾收集。所有,如果你知道系统暂时不会执行任何时序上关键的任务,你可以启动垃圾收集,并希望避免稍后在更关键时段进行收集。
C) JVM的系统开销
我们已经论述了许多JVM的内置特点,比如图形和网络,它们使得你的Java程序更快上市。所有这些特点的负面是JVM的内存开销。因为JVM是一个整块(要达到Java的可移植的目的,你必须完整的采纳),JVM的内存占用量不能减少。现在的JVM最少需要2MB以上的内存。
但是如果你的Java程序也在使用一些消耗内存的功能,由于一个JVM中有那么多的功能,各个Java应用程序就能写的小一点。如果你建立的是一个从网络上动态下载并运行多个程序的系统,那么这将是个很大的优点。但Java仍然不具备可配置性和可伸缩性,而这些是嵌入操作系统一直以老字号自居的特点。
D)硬件访问
Java实现可移植性的安全性的方法也意味着它缺乏直接同硬件接口的能力。JVM仅仅是一个虚拟的机器,一个对硬件的软件抽象,该抽象仅仅使连接是直接的。虚拟机控制与实际硬件的接口,而我们只能和虚拟机打交道。
但这并非无法逾越的限制,很多C程序使用内嵌汇编来规避性能上的瓶颈,所以Java程序也能使用C来获得对硬件的直接访问。
让Java和C一起工作有两种方式。第一、可以使用本地方式,它们是用C/C++或另一种语言写的,但当调用时,则装入与JVM同样的内存空间,运行于同样的环境。因为它们被编译成机器码,本地方式运行更快并能直接访问硬件。本地过程与Java代码之间通过套接来彼此交流,就像网络中通信端点使用的套接一样。在你选择了混合语言方法后,Java的与平台无关和安全特点就没有了。
可以考虑将前面提到的Java处理器作为软件JVM的解释器部分作为一种硬件实现方案。Java程序能在这些处理器上直接运行并操纵硬件,要注意Sun必需加一些特殊目的的指令给这种语言才能直接与这些处理器一起工作。
E) 语言尚不够成熟
Java于1996年5月发布,几个月就有了beta版。第一个主要修订版,Java Development Kit(JDK)1.1在一年以后开发出来,以标准的程序设计语言角度来看,Java还很年轻,也很粗糙。实际上,所有通用语言,都要几年时间才能够成熟到能可靠的写出作为产品的应用程序的程度。
在其进一步发展中,Sun公司分了三个步骤来促进Java成为一种通用语言和计算机平台。首先,用Java编程实现现存的商业和企业的一些功能活动,诸如电子邮件、日历和字处理程序。在这些方面,Java将与传统的编程语言和传统的编程方法竞争。其次,把Java提供给企业,使他成为一种编写内部应用程序的方法。信息科学部门常常要用一种必须编译的(因而是针对具体平台的)语言来产生客户程序,因此由于平台不同而编译和维护不同的版本。如使用Java,信息科学部门只需编写和维护一种版本。最后一步,是为传统嵌入式设备应用,比如移动电话、机顶盒以及打印机定义Java API以及语言功能。
Java开发的编程工具也仍在发展之中。有几个厂家提供编译器和开发工具,如Symantec、MICroSOFt以及Sun公司。Sun不再是JVM和JIT的仅有选择,其他几个供应商的产品也很有竞争力,这些公司在开发检测和调试工具上较慢。市场上有了一些初步的产品, Parasoft的Jtest软件自动为Java模块生成检测案例,而Numega的Jcheck为JVM中的程序行为提供一定的可见性。
目前仍然没有完善的交叉调试解决方案,即那种传统上被嵌入系统开发者用来处理目标平台上程序的方案,你很可能必须用C/C++来写你的程序中针对硬件的部分。不管怎样,你最好用一个C/C++交互调试器来调试那些代码,并在你的目标系统上用弹出对话框,保持记录文件,或其他类技巧来调试你的Java。
4、总结
由上可见,Java的嵌入式应用是排在Sun公司日程的最后的,Sun在继续为这些用途发展此语言,但对这方面的发展会次于桌面及企业用途。