background image

不会发生。

针对类文件采用以上不同的优化处理技术将对类文件所占空间起到不同的缩减作用

下表展示了不同策略对 java.lang.Vector 类文件的作用。同样的类文件经过不同方式的优
化处理后文件大小最多可以减半,这样就可以使下载时间缩短一半。针对类文件的编译优
化方式所能够达到的效果主要依赖于 Java虚拟机的优化程度。

〖表 1

 

〗 编译方式对 Vector 类大小的影响

编译方式

类文件(字节)

标准 javac 编译并通过调试

5330

标准 javac 编译

4163

经过优化后的编译

3398

经过优化和扰码处理的编译

3107

经过标准编译,同时对 JAR 文件进行优化

2103

经过优化编译,同时在 JAR 文件中采用扰码处理

1934

3. 运行时程序优化与内存管理

    在讨论降低运行时内存消耗多种方法之前,首先了解一下对象实例是以何种形式存储
在内存中。对象实例不同于数据类型,它们包含了操作数据的方法。程序中的对象通常是
以两种方式存储的。最简单的方法是存储每个对象内部方法代码的指针。这是一种快捷的
方式,因为调用一个方法只需要虚拟机将一个指针指向方法代码。缺陷也是明显的,即方
法越多,则对象实例变得越大。另外一种方式是使一个类的每个实例包含对类实例的引用

它包含了针对该类方法的指针。这第二种方式明显要慢,因为虚拟机必需跟踪两个指针
(其一是指向方法表,其二是指向方法)。然而,其重要的优势在于方法数量的增加并没
有增加实例的大小

[2]

。虽然 Java规范没有定义如何在内存中存储对象,但是大多数主

流的虚拟机使用了一种相同的方式。

Java 程序在运行时处理内存短缺问题方面的解决方案通常是使用 Java 语言提供的

无用内存单元回收功能(又称为垃圾回收功能)。程序在运行过程中需要构造对象实例,
这时程序解释器向操作系统发出内存申请,操作系统从内存堆中预留一块内存空间,并使
用这个空间来存储对象实例变量的值

[4]

。在程序运行过程中对象、变量和方法的构造都

会占用一定的内存空间,而某些变量或对象在完成了一次或几次调用后不会继续被程序所

使用。 无用单元回收 这一概念的含义就是程序中一个实用线程或进程跟踪程序,对那些
不再被使用的内存单元进行清理,并将释放后的内存单元归还操作系统或程序以便复用。
在这种前提下,开发人员并不需要特别指定从内存中删除特定对象的时间。传统的面向对
象程序设计语言在对象使用完成时,可以通过调用特定的方法来释放特定对象占用的内存
空间。如果程序员在设计程序过程中忘记释放所有冗余的对象,则随着时间的延长,空闲

内存的数量将逐渐减少。这就是所谓的 内存泄漏 现象。内存泄漏现象的出现不但影响了

3