java

位置:IT落伍者 >> java >> 浏览文章

Java性能的优化(上)


发布日期:2020年11月14日
 
Java性能的优化(上)

Java在九十年代中期出现以后在赢得赞歎的同时也引来了一些批评赢得的赞歎主要是Java的跨平台的操作性即所谓的Write OnceRun Anywhere但由于Java的性能和运行效率同C相比仍然有很大的差距从而引来了很多的批评

对于服务器端的应用程序由于不大涉及到界面设计和程序的频繁重启Java的性能问题看似不大明显从而一些Java的技术如JSPServletEJB等在服务器端编程方面得到了很大的应用但实际上Java的性能问题在服务器端依然存在下面我将分四个方面来讨论Java的性能和执行效率以及提高Java性能的一些方法

一.关于性能的基本知识

.性能的定义

在我们讨论怎样提高Java的性能之前我们需要明白性能的真正含义我们一般定义如下五个方面作为评判性能的标准

) 运算的性能哪一个算法的执行性能最好

) 内存的分配程序需要分配多少内存运行时的效率和性能最高

) 启动的时间程序启动需要多少时间

) 程序的可伸缩性程序在用户负载过重的情况下的表现

) 性能的认识用户怎样才能认识到程序的性能

对于不同的应用程序对性能的要求也不同例如大部分的应用程序在启动时需要较长的时间从而对启动时间的要求有所降低服务器端的应用程序通常都分配有较大的内存空间所以对内存的要求也有所降低但是这并不是所这两方面的性能可以被忽略其次算法的性能对于那些把商务逻辑运用到事务性操作的应用程序来讲非常重要总的来讲对应用程序的要求将决定对各个性能的优先级

.怎样才能提高JAVA的性能

提高JAVA的性能一般考虑如下的四个主要方面

) 程序设计的方法和模式

一个良好的设计能提高程序的性能这一点不仅适用于JAVA也适用也任何的编程语言因为它充分利用了各种资源如内存CPU高速缓存对象缓沖池及多线程从而设计出高性能和可伸缩性强的系统

当然为了提高程序的性能而改变原来的设计是比较困难的但是程序性能的重要性常常要高于设计上带来的变化因此在编程开始之前就应该有一个好的设计模型和方法

) JAVA布署的环境

JAVA布署的环境就是指用来解释和执行JAVA字节码的技术一般有如下五种即解释指令技术(Interpreter Technology)及时编译的技术(Just In Time Compilier Technology) 适应性优化技术(Adaptive Optimization Technology) 动态优化提前编译为机器码的技术(Dynamic OptimizationAhead Of Time Technology)和编译为机器码的技术(Translator Technology)

这些技术一般都通过优化线程模型调整堆和栈的大小来优化JAVA的性能在考虑提高JAVA的性能时首先要找到影响JAVA性能的瓶颈(BottleNecks)在确认了设计的合理性后应该调整JAVA布署的环境通过改变一些参数来提高JAVA应用程序的性能具体内容见第二节

) JAVA应用程序的实现

当讨论应用程序的性能问题时大多数的程序员都会考虑程序的代码这当然是对的当更重要的是要找到影响程序性能的瓶颈代码为了找到这些瓶颈代码我们一般会使用一些辅助的工具如JprobeOptimizitVtune以及一些分析的工具如TowerJ Performance等这些辅助的工具能跟蹤应用程序中执行每个函数或方法所消耗掉的时间从而改善程序的性能

() 硬件和操作系统

为了提高JAVA应用程序的性能而采用跟快的CPU和更多的内存并认为这是提高程序性能的唯一方法但事实并非如此实践经验和事实证明只有遭到了应用程序性能的瓶颈从而采取适当得方法如设计模式布署的环境操作系统的调整才是最有效的

.程序中通常的性能瓶颈

所有的应用程序都存在性能瓶颈为了提高应用程序的性能就要尽可能的减少程序的瓶颈以下是在JAVA程序中经常存在的性能瓶颈

了解了这些瓶颈后就可以有针对性的减少这些瓶颈从而提高JAVA应用程序的性能

提高JAVA程序性能的步骤

为了提高JAVA程序的性能需要遵循如下的六个步骤

a) 明确对性能的具体要求

在实施一个项目之前必须要明确该项目对于程序性能的具体要求这个应用程序要支持个并发的用户并且响应时间要在秒钟之内但同时也要明白对于性能的要求不应该同对程序的其他要求沖突

b) 了解当前程序的性能

你应该了解你的应用程序的性能同项目所要求性能之间的差距通常的指标是单位时间内的处理数和响应时间有时还会比较CPU和内存的利用率

c) 找到程序的性能瓶颈

为了发现程序中的性能瓶颈通常会使用一些分析工具TowerJ Application Performance Analyzer或VTune来察看和分析程序堆栈中各个元素的消耗时间从而正确的找到并改正引起性能降低的瓶颈代码从而提高程序的性能这些工具还能发现诸如过多的异常处理垃圾回收等潜在的问题

d) 采取适当的措施来提高性能

找到了引起程序性能降低的瓶颈代码后我们就可以用前面介绍过的提高性能的四个方面即设计模式JAVA代码的实现布署JAVA的环境和操作系统来提高应用程序的性能具体内容将在下面的内容中作详细说明

e) 只进行某一方面的修改来提高性能

一次只改变可能引起性能降低的某一方面然后观察程序的性能是否有所提高而不应该一次改变多个方面因为这样你将不知道到底哪个方面的改变提高了程序的性能哪个方面没有即不能知道程序瓶颈在哪

f) 返回到步骤c继续作类似的工作一直达到要求的性能为止

二. JAVA布署的环境和编译技术

开发JAVA应用程序时首先把JAVA的源程序编译为与平台无关的字节码这些字节码就可以被各种基于JVM的技术所执行这些技术主要分为两个大类即基于解释的技术和基于提前编译为本地码的技术

具体可分为如下的五类

a) 解释指令技术

其结构图和执行过程如下

JAVA的编译器首先把JAVA源文件编译为字节码这些字节码对于JAVA虚拟机(JVM)来讲就是机器的指令码然后JAVA的解释器不断的循环取出字节码进行解释并执行

这样做的优点是可以实现JAVA语言的跨平台同时生成的字节码也比较紧凑JAVA的一些优点如安全性动态性都得保持但缺点是省生成的字节码没有经过什么优化同全部编译好的本地码相比速度比较慢

b) 及时编译技术(Just In Time)

及时编译技术是为了解决指令解释技术效率比较低速度比较慢的情况下提出的其结构图如下所示

其主要变化是在JAVA程序执行之前又JIT编译器把JAVA的字节码编译为机器码从而在程序运行时直接执行机器码而不用对字节码进行解释同时对代码也进行了部分的优化

这样做的优点是大大提高了JAVA程序的性能同时由于编译的结果并不在程序运行间保存因此也节约了存储空间了加载程序的时间缺点是由于JIT编译器对所有的代码都想优化因此也浪费了很多的时间

IBM和SUN公司都提供了相关的JIT产品

c) 适应性优化技术(Adaptive Optimization Technology)

同JIT技术相比适应性优化技术并不对所有的字节码进行优化它会跟蹤程序运行的成个过程从而发现需要优化的代码对代码进行动态的优化对优化的代码采取/的策略从理论上讲程序运行的时间越长代码就越优化其结构图如下

其优点是适应性优化技术充分利用了程序执行时的信息发行程序的性能瓶颈从而提高程序的性能其缺点是在进行优化时可能会选择不当发而降低了程序的性能

其主要产品又IBMSUN的HotSpot

d) 动态优化提前编译为机器码的技术(Dynamic OptimizationAhead Of Time)

动态优化技术充分利用了JAVA源码编译字节码编译动态编译和静态编译的技术其输入时JAVA的原码或字节码而输出是经过高度优化的可执行代码和个来动态库的混合(Window中是DLL文件UNIX中是共享库a so文件)其结构如下

其优点是能大大提高程序的性能缺点是破坏了JAVA的可移植性也对JAVA的安全带来了一定的隐患

其主要产品是TowerJ

上一篇:Java Listener模式

下一篇:Java内存管理的9个小技巧