2007年02月08日

    Mark Lam has been a virtual machine engineer in the JavaME CDC team at Sun Microsystems for over 6 years. Before joining Sun, he was a real-time embedded systems developer for 6+ years, working on application frameworks, graphics systems, networking protocols, game development, and fault tolerant systems amongst other things, on devices ranging from 64KB 8bit uControllers to 32-bit RISC machines.
原文URL:http://weblogs.java.net/blog/mlam/archive/2006/11/when_does_javas_1.html#more

 在我关于性能的文章中有一个评论,问到:我想到关于设备日益强大的处理能力和更多的RAM的事实,我想什么时候才是JavaSE代替JavaME/CDC的最好选择?你需要多少的CPU,RAM,Cache?
 在我回答这个之前,我必须放弃一个我是一个工程师的,这对我的雇员,Sun,甚至是Sun的其他工程师是不必要的。基于这点,让我们进入这个问题吧。。。
JavaSE or JavaME
 最初的问题是基于设备兼容性和性能为依据的。这个问题有许多尺度比我们第一次看到的。这个问题基于规范,普遍存在的,可移植的,等等。让我们从显而易见的地方开始。。。
设备能力
 如果你的设备象一个桌面/服务器(象奔腾系列)建立在嵌入式的盒子里。那么,常规来看,JavaSE VM能够取得更好的性能。如果性能稍微差些,那么你的路就长了。我说奔腾系列仅仅是给你一个计算能力的比较。我不是说只有X86处理器。显而易见,JavaSE也为SPARC和PowerPC移植,他们有同样的规则应用在这里。
 设备性能不只是关于选择处理器。以PowerPC为例。它嵌入我们已知的许多桌面和服务版本。处理器核心是一样的(执行同样的代码),但他们的性能是不一样的。显而易见他们的时钟频率,高速缓存是不一样的。还有其他的硬件不同(例如主板等级)在性能上。高速缓存体系,2极缓存,主内存容量,内存速度,总线速度,内存和I/O体系,I/O处理器,MMU,DMA,TLAB size,辅助存储器(硬盘,闪存)等等。。。你的设备有这些特性的大部分,这样看起来JavaSE更好,反之亦然。
 仅仅是看下内存容量,我想JavaSE在10,100MBs,甚至GBs内存上典型的操作有同样的footprint。CVM的操作通常在10MBs以下。当然,这取决于你的应用程序在做什么(对JavaSE和CVM一样)。但这些数字给你一个想法。如果你的设备有16MB RAM,CVM可能是你最好的办法。如果你有32MB RAM,它只会得到一点的提升,这依靠你努力达到的程度。CVM对大多数嵌入式应用程序仍然是最好的办法。低于100MBs,它仍然是比JavaSE有希望的。如果设备有1G或更多,我非常同意JavaSE是更好的选择。
 对于高速缓存,这更难告诉我们。0~10 KBs于CVM匹配。10~100 KBs,仍然是CVM。如果高速缓存大于1MBs,你可以默认运行JavaSE。但这不意味这CVM不是一个更好的选择。
 对时钟频率,低于100MHz,CVM是你较好的选择。100MHzs~1GHz,仍然是CVM。超过1GHz,JavaSE是当然的选择。但Sun在不久前展示了这些,CPU性能不只是时钟频率(参考 CoolThreads)。因此,上面的数字相对的。事实上,上面我提到的所有方面只是基于我的经验的猜测教育。我们可以使用这些提示,但真实世界的案例是不同的,这就是上面给出的案例没有固定规则的原因。
 现在,我们来谈论这些显而易见的材料,让我们进入那些人们没有想到的。。。
嵌入式系统开发者注意
 嵌入式硬件常常需要下面的特性:便宜(成本方式,非品质),可靠的,可能滞后于技术发展水平曲线一点,不会太多。它需要便宜是因为目标消费者是平常的人。便宜意味着你能够卖的更多。可靠性是显而易见的,没有人想要一个不可靠的系统。另外,死机的蓝屏(从其他的计算机体验)接受的体验。在嵌入式设备,如果设备失败,人们会得到真的伤害或苦恼。基于这些,设备厂商小笔记簿会受到伤害。消费者期望系统没有异常的工作。The lagging(绝缘材料?)的曲线部分是大部分cost reason(成本?)。曲线的最新的边缘是非常昂贵的。太多的lagging是昂贵的,因为部分(它们的替代)很难找到。在曲线之后的痕迹有一点典型的收益。显而易见,它们不能应用于所有的嵌入式设备。但我的焦点在这个观点,异常的案例也会背离这个这个理由。
 因此,这对于嵌入式软件(包括JavaME)开发者意味着什么?
可移植性
基于技术曲线变化,硬件设备应注意升级老设备导致成本过高的。当然,升级也会带来对硬件性能有利的地方。有时候,升级不仅仅是替换CPU,它是全部体系的更换。
有时候,厂商会基于不同的性能提出不同的硬件等级。比如,低端和高端是2个不同的市场,这些设备不会总是建立在同样的CPU体系上。
这是为什么JavaME吸引人的地方(write once run anywhere)。但WORA依靠Java VM的移植。因此,VM的可以移植性是非常重要的。在这之后,开发成本和移植成果同样棘手。 它会使厂商想把这些都最小化。这也是CVM更适合的一个原因。我会在一系列文章中解释,CVM的体系对不同的平台来说更容易移植。这不是说JavaSE不能移植,只是它不太容易做到。我在前面已经指出,可以移植性来自于性能成本。尽管这些成本对大部分案例来说微不足道。这就是为什么CVM的性能在好的设备上比不上JavaSE的原因。相反的,JavaSE难以移植。CVM选择可移植性,JavaSE选性能。
普遍存在的
 普遍存在的,我没有提及那些支持java的设备作为在这个领域里使用它们的小组。在这个案例里,我会提及VM移植的实用性。这些都基于易于移植。因为CVM是容易移植的,它的移植可用性(CPU体系和OS平台)多于JavaSE。举个例子,像这写的,CVM移植到ARM,MIPS,x86,SPARC和PowerPC。一些消费者会把CVM移植到其他CPU体系。前面我们知道,JavaSE只移植到x86,SPARC和PowerPC。你选择一个源代码已经移植的可用VM。除非你自己想做移植。这是一个可选项(通常这个工程师的玩笑,因为你的工作多移植有影响),你必须花时间去将它做正确。因此,这需要依靠你的开发者的时间表。如果你选择作一个移植,CVM是一个值得关注的容易移植的选择,对于你想在短时间里得到正确的高可移植性。
 这是CVM体系对于多样的嵌入式系统便于移植的一个因素,这是必要的折衷。
符合目的
像上面说的,你需要基于你要怎样的java平台特性在你的设备上运行来决定。让我们看几个例子:
案例1:你的设备是x86的盒子,只制造很少的数量(10s~100s),你可以在它身上花大量的金钱。它有1G的内存,有硬盘存储器。它主要运行一个java程序。这个程序有很沉重的线程负担,高性能。这个程序有特殊的目的,只对于这个盒子。这个盒子不被期望运行其他程序,尽管你可以升级它来适应你的程序。那么你的选择是JavaSE。关键字是:桌面/服务器类硬件,高性能,特殊目的的软件。它不服从标准。
案例2:你的设备要卖上百万台。它运行在ARM处理器。32M RAM。只有非常少的高速缓存。基于JavaME CDC1.1它有自己的组件,有自己的规范,应用在一系列的市场。那你的选择是CVM。关键字是:便宜的设备,小或低的性能,需要适应CDC。
案例3:你的设备是服务器,需要运行JavaEE servlets,它要在同一时间提供1000个servlet。每个servlet需要运行它自己的进程,不是线程。Servlet自己有多个线程。Servlets被期望有短的生命期。性能是临界的。每个servlet操作一个来自网络的服务会话。服务是未知的(没有图形),不计算范围(没有太多的问题需要解决)。如果servlets没有及时响应,,使用设备的用户会苦恼,非常的苦恼。设备有4G内存,配置4个超级CPU,需要适应JavaEE。
显而易见的答案是。。。JavaSE?不绝对。这是为什么:JavaSE比CVM有大的footprint。JavaSE基本的footprint是20MB。CVM的基本footprint在2MB以下。每个servlet需要4MB的内存来运行。因此,运行servlet的一个JavaSE实例需要大约24MB的内存。每个运行servlet的CVM需要大约6MB。
如果设备任何时候都有4GB内存,它可以运行170个JavaSE实例,或者682个CVM实例。如果你不想处理硬盘内存分页,那么你想同一时间你可以响应1000个服务请求里的多少?
我不想回答这个。答案是你必须清楚你想的。显而易见,仅仅是考虑设备性能,你不能做出最好的决定。其他方面,需要解决适应JavaEE。CVM完全适应Java VM第2版规范。因此,你可以在它上面运行JavaSE和JavaEE。但不会增加CVM的footprint,它仅仅是2MB。是的,我没有说出JavaSE VM的footprint的具体数量。我的例子的人为的,但它不是一个不可用的。它解释了我观点,事情不总是像它看上去的那样。有许多的事情需要考虑,的确,硬件/设备性能是不最重要的因素。
这对你意味着什么
 好的工程实践总是你决定的指南。明白你需要的(你的程序要干什么),考虑所有的因素:设备性能,可移植性,普遍存在,适应性,还要其他我们在上面谈到的。

祝有美好的一天!