浅谈AIX环境下的Java性能调优


1、什么是Java

Java 是一种面向对象的编程语言。它以 C++ 为模型,被设计成小的、简单的、在源和二进制级别跨平台的可移植的语言,Java 程序(applets 和应用程序)可以运行于任何已经安装了 Java 虚拟机(JVM)的机器上。Java 相对其它计算机语言有显著的优势,适合于任何编程任务,Java 有以下优势:

 

Ø  Java 是独立于平台的:Java 最显著的一个优势就是它轻易从一台计算机系统移动到另一台的能力。对于任何Web软件至关重要的就是在许多不同系统上运行同一个程序的能力, Java 成功之处在于在源和二进制级别能够独立于平台。

 

Ø  Java 是面向对象的:Java 的另外一个优点在于利用面向对象的方法。这允许你创建模块化程序和可重用代码。

 

Ø  Java 容易学习:Java 被设计成容易使用的语言,因此它更易于写、编译、调试以及学习。

 

Ø  Java 是电子商务的解决方案: 由于 Java 的健壮性、使用方便、跨平台的能力和安全性特点,它已成为了提供世界范围内因特网解决方案的选择语言。

 

2、AIX环境下的Java版本


目前,AIX操作系统可以支持多个Java版本,可以在一个操作系统下同时安装多个Java版本,应用需要哪个版本时,可设置PATH路径到此版本所在的目录。以下是AIX可支持的Java版本信息:

Ø  Java 1.1.8

Ø  Java 1.2.2

Ø  Java 1.3.0

Ø  Java 1.3.1 32bit

Ø  Java 1.3.1 64bit

Ø  Java 1.4   32bit

Ø  Java 1.4   64bit

 

从性能来看,尽量使用高版本的AIX和高版本的Java,并且安装最新的操作系统和Java补丁包。当需要超过2GB的Java 堆时,需要使用64bit的Java。在AIX环境下,Java是免费使用的,可以从下列网址下载Java软件:

http://www6.software.ibm.com/dl/dka/dka-p

 

从下列网址下载AIX操作系统和Java的补丁包:

http://techsupport.services.ibm.com/server/fixes.

 

3、Java 性能准则


在编写Java应用程序时,以下是基本的准则:

 

l  使用字符串缓冲区而不是字符串连接,当进行连续字符串操作时要避免不必要地创建那些最终必须经过垃圾回收的对象。

l  避免连续写入 Java 控制台以减少字符串操作、文本格式化以及输出的花费。

l  必要时通过使用变量的原语类型来避免对象创建和操作的花费。

l  经常高速缓存用过的对象以减少必须的垃圾回收数量,并且避免重复创建对象的需求。

l  尽可能分组本地操作以减少 Java 本地接口(JNI)的调用。

l  只有在必要时再使用同步方法,以此限制在 JVM 和操作系统中的多任务。

l  除非必要避免调用垃圾回收器。如果您必须调用它,只有在空闲时间或一些非关键阶段再这样做。

l  可能时使用整型而不是长整型,因为 32 位操作快于 64 位。

l  可能时申明方法为 final。JVM 处理 final 的方法较好。

l  当创建常量时为了减少变量需要初始化的次数,使用关键字 static final。

l  避免不必要的“casts”和“instanceof”引用,因为在 Java 中销毁操作不是在编译时而是在运行时执行的。

l  当数组可以满足要求时尽可能避免使用向量。

l  从向量末端添加和删除项以得到较高性能。

l  使用 -O 选项编译 Java 文件。

l  避免在循环中分配对象。

l  使用缓冲区 I/O 并调优缓冲区大小。

l  使用连接池和准备缓存声明进行数据库访问。

l  使用连接池连接到数据库并重用连接而不是重复打开和关闭连接。

l  最大化线程生存期并最小化线程创建和销毁循环。

l  最小化共享资源的争用。

l  最小化短生存期对象的创建。

l  避免远程方法调用。

l  使用回调以避免阻塞远程方法调用。

l  避免创建只用来访问一个方法的对象。

l  尽可能保持同步方法处于循环外。

l  在数据库中以 Unicode 形式存储字符串和字符数据。

l  记录 CLASSPATH 以便最常用的库先出现。

4、监视 Java


在AIX 操作系统中有许多工具可以用来监视Java应用程序的性能,以下是简单的概述。

 

vmstat

这条命令提供了各种系统资源的信息。它报告了运行队列以及等待队列中内核线程的统计信息、内存使用、页面调度空间、磁盘 I/O、中断、系统调用、上下文切换以及 CPU 活动。

 

iostat

这条命令报告了详细的磁盘 I/O 信息。

 

topas

这条命令报告了 CPU、网络、磁盘 I/O、工作负载管理器和进程活动。

 


tprof -k -s -e -x "sleep 10"


这条命令可被用来剖析应用程序以查明任何可能影响性能的活动程序/方法。

 

ps -mo 线程

这条命令显示了一个进程或线程绑定于哪一个 CPU。

 

java -verbose:gc

这个选项可被用来检查垃圾回收对您的应用程序的冲击。它报告了垃圾回收所花的总共时间,平均每一次垃圾回收花费时间,平均每一次垃圾回收收集的内存以及平均每一次垃圾回收中的对象数。

 

5、Java应用程序性能调优

 

建议在运行Java应用的AIX用户环境下,设置以下环境变量。

 

AIXTHREAD_SCOPE=S

用 AIX 4.3.1 启动,此变量缺省值为 P。这表示进程宽度争用作用域(M:N)。对于 Java 应用程序,您应该设置这个值为 S,它表示系统宽度争用作用域(1:1)。

 

AIXTHREAD_MUTEX_DEBUG=OFF

用调试器为使用目的维持一个活动人工干预列表。

 

AIXTHERAD_COND_DEBUG=OFF

用调试器为使用目的维持一个条件变量列表。

 

AIXTHREAD_RWLOCK_DEBUG=OFF

pthreads 库用调试器为使用目的维护一个包含活动互斥锁定、条件变量以及读/写锁定的列表。当一个锁定初始化,如果列表中没有这一锁定,它被加入到列表中。此列表以链表形式实现,因此当列表变大时通过搜索它来确定一个锁定是否存在就包含了性能问题。问题是此列表被锁定保护,这一锁定在搜索操作过程中一直保持。当搜索进行时其它对 pthread_mutex_init() 调用的子例程必须等待。为了优化性能,您应当将此线程调试选项设置为 OFF。它们的缺省值为 ON 。

 

SPINLOOPTIME=500

spinloop 时间是一个进程在阻塞前在一个繁忙的锁定上可以循环的次数。这个值缺省设置为 40。如果 tprof 输出表明 check_lock 例程具有高的 CPU 使用率,并且如果通常锁定在短时间内可用,您应当通过将值设置为 500 或更高来提高循环时间。

 

同样,运行Java应用的AIX用户环境下,推荐以下设置:

ulimit -d 不限制

ulimit -m 不限制

ulimit -n 不限制

ulimit -s 不限制

 

操作系统内一定的环境参数和设置可以用来调优 Java 性能。同样,许多调优系统部件如 CPU、内存、网络、I/O 等等的技术,可以提高 Java 性能。

 

为了使得 Java 的性能和可伸缩性尽可能的好,您应当使用最新可用版本的操作系统和 Java,以及Just-In-Time(JIT)编译器。

 

与 Java 相关的最普通的性能问题与垃圾回收机制有关。如果 Java 堆太大,则堆将必须驻留在主内存外。这将导致页面调度活动增加,它将影响 Java 性能。同样,一个大的堆可能花很多秒去填充。这意味着,尽管垃圾回收活动不频繁,但与垃圾回收相联系的暂停次数将增加。为了调优 Java 虚拟机(JVM)的堆,使用 java 命令加选项 -ms -mx。使用垃圾回收统计信息来帮助决定最佳设置。