5.4 Java
近年来,可以公平地说,分布式应用服务器已把Java作为首选的设计技术。来自IBM的产品,如WebSphere和Oracle的(Bea)的WebLogic在部署解决方案市场上占据着主导地位,而其他一些在集成应用上的主导者,如SAP公司则提供一个基于Java的中间层。另外,软件设计师们还有许多其他Java应用服务器技术可供选择,包括JBoss和JRun。
Java应用程序客户端可以用很多种方式接入,对于性能测试工具来说,“纯Java”的胖客户端也许最具挑战性,它记录了中间件与常用的浏览器客户端使用HTTP协议与Web服务器层的交互信息。
基于Java应用程序的基本组件,重要的是能够获得在负载和压力情况下应用服务器的内部工作情况。有几个可用的工具(见附录C),可以提供这种程度的可见性分析,它们揭示了这些设计效率低下的组件或方法消耗了过多的内存和CPU,同时在响应时间和可扩展性上造成了负面影响。
Java绝非特例,以下是一些常见的问题,如果在组件和方法层面上没有详细的监测机制,是很难发现这些问题的。
内存泄漏
这是一种典型的情况,当一个组件使用了内存但没有释放,于是就逐渐减少了系统的可用内存,渗透测试是发现这种问题的一种很好的方法,因为内存泄漏需要应用程序运行一段时间后才会影响到应用程序。
过多的组件实例
通常一些应用逻辑会对特定的一个组件产生了过多实例。尽管这不一定会引起性能问题,但是却会导致内存利用率很低和CPU利用率过高。这可能是由于代码问题引起的,或是应用程序服务器的配置不正确。无论哪种原因,一般都不会意识到这些问题,除非你在组件级别上检查应用服务器。
线程堵塞
这种情况在第4章中简单地提到过。线程阻塞的现象发生在应用服务器的一个组件在等待其他内部组件或外部调用数据库(这种情况更加常见)响应时,或者在等待第三方应用程序的响应时。通常唯一的症状只是响应时间很长,而并没有占用过多的内存或CPU。由于应用服务器的内部工作情况是不可见的,所以这种问题很难独立分析。
迟缓的SQL语句
应用服务器组件调用SQL也是影响系统性能问题的原因之一。在数据库里有特定的代码调用存储过程,同时也需要注意,应用服务器组件进行SQL解析也可能会引起性能问题,但不会立刻从数据库的临时监视器中体现出来。