from IBM
Java 性能准则
在编写Java应用程序时,以下是基本的准则:
- 使用字符串缓冲区而不是字符串连接,当进行连续字符串操作时要避免不必要地创建那些最终必须经过垃圾回收的对象。
- 避免连续写入 Java 控制台以减少字符串操作、文本格式化以及输出的花费。
- 必要时通过使用变量的原语类型来避免对象创建和操作的花费。
- 经常高速缓存用过的对象以减少必须的垃圾回收数量,并且避免重复创建对象的需求。
- 尽可能分组本地操作以减少 Java 本地接口(JNI)的调用。
- 只有在必要时再使用同步方法,以此限制在 JVM 和操作系统中的多任务。
- 除非必要避免调用垃圾回收器。如果您必须调用它,只有在空闲时间或一些非关键阶段再这样做。
- 可能时使用整型而不是长整型,因为 32 位操作快于 64 位。
- 可能时申明方法为 final。JVM 处理 final 的方法较好。
- 当创建常量时为了减少变量需要初始化的次数,使用关键字 static final。
- 避免不必要的“casts”和“instanceof”引用,因为在 Java 中销毁操作不是在编译时而是在运行时执行的。
- 当数组可以满足要求时尽可能避免使用向量。
- 从向量末端添加和删除项以得到较高性能。
- 使用 -O 选项编译 Java 文件。
- 避免在循环中分配对象。
- 使用缓冲区 I/O 并调优缓冲区大小。
- 使用连接池和准备缓存声明进行数据库访问。
- 使用连接池连接到数据库并重用连接而不是重复打开和关闭连接。
- 最大化线程生存期并最小化线程创建和销毁循环。
- 最小化共享资源的争用。
- 最小化短生存期对象的创建。
- 避免远程方法调用。
- 使用回调以避免阻塞远程方法调用。
- 避免创建只用来访问一个方法的对象。
- 尽可能保持同步方法处于循环外。
- 在数据库中以 Unicode 形式存储字符串和字符数据。
- 记录 CLASSPATH 以便最常用的库先出现。
监视 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
这个选项可被用来检查垃圾回收对您的应用程序的冲击。它报告了垃圾回收所花的总共时间,平均每一次垃圾回收花费时间,平均每一次垃圾回收收集的内存以及平均每一次垃圾回收中的对象数。
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用户环境下,推荐以下设置:
l ulimit -d 不限制
l ulimit -m 不限制
l ulimit -n 不限制
l ulimit -s 不限制
操作系统内一定的环境参数和设置可以用来调优 Java 性能。同样,许多调优系统部件如 CPU、内存、网络、I/O 等等的技术,可以提高 Java 性能。
为了使得 Java 的性能和可伸缩性尽可能的好,您应当使用最新可用版本的操作系统和 Java,以及Just-In-Time(JIT)编译器。
与 Java 相关的最普通的性能问题与垃圾回收机制有关。如果 Java 堆太大,则堆将必须驻留在主内存外。这将导致页面调度活动增加,它将影响 Java 性能。同样,一个大的堆可能花很多秒去填充。这意味着,尽管垃圾回收活动不频繁,但与垃圾回收相联系的暂停次数将增加。为了调优 Java 虚拟机(JVM)的堆,使用 java 命令加选项 -ms 或 -mx。使用垃圾回收统计信息来帮助决定最佳设置。[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26651/viewspace-1031175/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26651/viewspace-1031175/