- 4
- 0
- 约1.03万字
- 约 8页
- 2017-02-09 发布于重庆
- 举报
Java内存空间利用研究
Java程序内存空间优化策略的研究
徐 鹏
清华大学计算机系(E-mail: xp@)
摘要: Java类可以直接通过Java虚拟机解释执行。然而类文件的规模会直接影响到程序的加载和运行速度。随着Java技术越来越多地被应用在实际系统中,数据的使用量越来越大,内存空间的优化策略变得非常重要。本文针对Java应用程序在运行时占用内存过大这一突出问题,提出从降低类文件大小和运行时内存占用量两方面的解决方案,并着重分析了在软件设计过程中通过运用面向对象的程序设计思想,从软件工程的角度上解决内存泄漏的问题。
关键字: 内存空间优化、扰码处理、内存泄漏、Java虚拟机、唯一模式
1. 引言
基于Java的应用程序在运行时由于受到语言本身的特点和虚拟机的限制,对于客户端硬件配置的要求相对于Visual C++和Visual Basic语言编写的程序要高。虽然Java 2对于JDK虚拟机解释器进行了优化处理,但是仍然不能够完全令用户满意。因此Java程序的开发人员在对程序代码进行优化时,很自然地将关注焦点放在提高运行性能上。然而,Java程序还可以从另一方面得到优化,即对程序所占用内存空间进行优化。很多功能复杂的Java应用程序在运行时由于系统频繁针对内存进行存储交换操作,从而在很大程度上影响了软件运行的性能。程序中存在的内存漏洞造成了程序通过操作系统消耗内存,而没有及时进行对内存空间的复用和释放,这最终造成了程序消耗的内存空间逐渐加大。从软件工程的角度分析,对空间的优化处理主要以两种形式表现出来:降低类文件的大小和降低程序运行时对内存的占用量。本文将从这两方面提出相应的优化策略。这两方面的优化策略从实现角度来看可以划分在三个不同的级别上进行:
编译器级:通过类文件的编译优化处理实现;
程序员级;通过内存管理和程序优化处理实现;
优化工具级:通过现有的实用软件工具检测内存使用状况并优化。
2. 类文件的编译优化处理
在Java开发过程中,Java源代码被编译成一种中间形式,称为字节代码(Java类文件),从理论上讲,这种代码是具有平台独立性的,可以运行在任何具备Java虚拟机的计算平台上[1]。当然,Java源代码是以提高可读性为标准的方式编写的。Java编译器的工作就是获得源代码并产生相应的字节码。Java虚拟机将字节码转换成主机平台的本地代码。在Web环境下运行Applet程序之前,类文件首先必须被下载到客户端。类文件越大,程序下载时间越长。特别是对于网络并不发达的地区,由于网络的传输速度较慢,因此这种问题表现的更加突出。
从编译的角度入手,我们可以采用以下三种方式来降低类文件的大小:
1. 使用Java编译器的优化选项
在缺省条件下,JDK提供的javac编译器生成的类文件包含程序行号信息(加入行号信息的作用是便于用户进行调试,同时在程序运行时如果出现例外,则解释器会利用行号信息显示出例外发生的行号)。如果使用-g选项进行编译操作,那么类文件也包含变量调试信息。这些额外的数据在类文件中占据了一定比例。通过使用-O选项启动编译优化器进行编译,则可以强制javac编译器删除这些额外数据。这种优化选项也可以造成javac编译器删除一些冗余的代码,但是同时它也内嵌一些方法用于改进性能(这些方法也占据了类文件的一定空间)。与一个标准的C编译器不同,javac的-O选项在优化方面所作的工作还非常有限。
2. 以Java档案文件(JAR文件)的形式对类进行压缩处理
从Java 1.1开始,JDK就提供了生成Java档案文件(JAR文件)的功能。这种经过压缩处理的文件中包含了Java类,其压缩方法基于ZIP压缩格式。档案文件的使用显著地降低了类文件所占用的磁盘空间,例如标准的Java类库经过压缩处理后所占用的磁盘空间从8.63MB降低到5.03MB。这是一种最简单也是最有效的降低类文件所占空间的方法。此外,因为档案文件将多个类打包在一个文件里,因此在Applet下载过程中只涉及了一次FTP事务处理,因此下载时间大大加快了。开发人员可以使用JDK提供的jar工具来生成JAR文件。例如,jar –cf classes.jar *.class命令实现了将当前目录中所有类文件封装成JAR文件的功能。在HTML文件中的APPLET标签支持ARCHIVE参数,该参数的取值为当前Applet程序中所使用的JAR文件路径。如果我们在一个Java应用程序中引用JAR文件,则我们必须在系统环境变量CLASSPATH中加入JAR文件的路径。
3. 使用扰码处理技术降低空间占用量。
Java解释器实现对类的动态链接,也就是说,解释器并不是一次将所有类进行加载,而是在运行时遇到类引用时才对其进行加载。正是由于这个原
原创力文档

文档评论(0)