手机怎么写java代码( 二 )


虽然这个功能非常有用 , 且大大降低了在代码中引入内存问题的风险 , 但是它会增加运行时的开销 , 因为需要不停地执行垃圾回收进程 。本文开头将比较Java SE和用于Android开发的Java之间的差异 。
首先我会介绍开发者习惯的Java SE语言结构以及它们是如何在Android上运行的 。其次 , 我会介绍如何优化Android中的Java代码 , 如何优化内存分配 , 以及如何恰当地处理多线程 。
【手机怎么写java代码】比较Android上的Dalvik Java和Java SE虽然远在Android出现之前 , 开发者就能用Java编程语言为移动设备编写应用程序 , 但它只是Java中功能极为有限的一个版本 , 称为Java ME(微型版) 。不同的移动设备还需编写不同的代码 , 因此 , 写一个应用程序就能在支持Java ME的任何手机上运行是几乎不可能的 。
此外 , 由于当时不存在很好的在线商店 , 应用发布过程极其复杂 。Android的问世为开发者提供了构建智能手机强大应用的机会 , 开发者只需用Java编程语言以及他们熟知的标准Java API编写代码 。
然而 , 尽管Android开发者仍使用Java SE编译器来编译应用程序 , 你会发现 , James Gosling开发的Java和Android设备上的Java存在许多不同之处 。在Android设备上运行的VM(虚拟机)称为Dalvik 。
它最初由谷歌的Dan Bornstein开发 , 适用于CPU和内存受限的移动设备 。Java SE和Dalvik Java存在一些差异 , 主要体现在虚拟机上 。
Java SE使用了栈机设计 , 而Dalvik被设计成了基于寄存器的机器 。Android SDK中有一个dx工具 , 它会把Java SE栈机器的字节码转换成基于寄存器的Dalvik机器字节码 , 该转换步骤由IDE自动完成 。
基于栈的虚拟机和基于寄存器的虚拟机的定义以及差异将不列入我们的讨论范围 。由于历史原因 , Android使用基于寄存器的虚拟机 。
虽然基于寄存器的虚拟机最多可以比基于栈的虚拟机快32% , 但这只限于执行时解释字节码的虚拟机(也就是说 , 解释型虚拟机) 。在Android 2.2版本(也称为Froyo)之前 , Dalvik虚拟机都是纯解释型的 。
Froyo版本引入了JIT编译器(即时编译) , 这是Java SE很早就有的一个优势 。JIT编译 , 也称为动态翻译 。
它在执行前把字节码翻译成本机代码(如图1所示) , 这样主要有两个好处 。首先 , 它消除了那些纯解释型虚拟机的开销;其次 , 它能对本机代码执行优化 , 这通常是静态编译代码无法做到的 。
例如 , JIT编译器可以在它运行的CPU上选择最合适的优化 , 也可以根据应用程序的输入来分析代码是如何运行的 , 以便进行下一步的优化 。图1 Android Java和Java SE翻译步骤虽然Android的Dalvik JIT编译器有很大的发展前景 , 但要达到如Java SE的JIT编译器般稳定、成熟度尚需很长一段时间 。
不过 , Dalvik JIT的出现为Android提供了巨大的性能优势 , 而且它也在不断得以改善 。JAVA SE虚拟机和Dalvik虚拟机的另一个区别是 , 后者进行了优化 , 可运行在同一个机器上的多个实例中 。
它在开机时会启动一个叫做zygote的进程 , 该进程会创建第一个Dalvik实例 , 由这个实例创建所有其他的实例 。当应用程序启动时 , zygote进程会收到一个创建新虚拟机实例的请求 , 并给该应用程序创建一个新进程(如图2所示) 。