Java EE应用程序在Glassfish上的性能调优案例分析

Java EE应用的性能问题对严肃的项目和产品来说是一个非常重要的问题。特别是企业级的应用,并发用户多,数据传输量大,业务逻辑复杂,占用系统资源多,因此性能问题在企业级应用变得至关重要,它和系统的稳定性有着直接的联系。更加重要的是,性能好的应用在完成相同任务的条件下,能够占用更少的资源,获得更好的用户体验,换句话说,就是能够节省费用和消耗,获得更高的利润。

要获得更好的性能,就需要对原来的系统进行性能调优。对运行在Glassfish上的JavaEE应用,调优是一件相对复杂的事情。在调优以前必须要认识到:对JavaEE的系统,调优是多层次的。一个JavaEE的应用其实是整个系统中很少的一部分。开发人员所开发的JavaEE程序,无论是JSP还是 EJB,都是运行在JavaEE应用服务器(Glassfish)之上。而应用服务器本身也是Java语言编写的,需要运行在Java虚拟机之上。 Java虚拟机也只不过是操作系统的一个应用而已,和其他的应用(如Apache)对于操作系统来说没有本质的区别。而操作系统却运行在一定的硬件环境中,包括CPU,内存,网卡和硬盘等等。在这么多的层次中,每一个层次的因素都会影响整个系统的性能。因此,对一个系统的调优,事实上需要同时对每个层次都要调优。JavaEE应用性能调优不仅仅和Glassfish有关,Java语言有关,还要和操作系统以及硬件都有关系,需要调优者有综合的知识和技能。这些不同层面的方法需要综合纵效,结合在一起灵活使用,才能快速有效的定位性能瓶颈。下面是一些具体的案例分析:

内存泄漏问题

某个JavaEE应用运行在8颗CPU的服务器上。上线运行发现性能不稳定。性能随着时间的增加而越来越慢。通过操作系统的工具(mpstat),发现在系统很慢的时候,只有一颗CPU很忙,其他的CPU都很空闲。因此怀疑是Java虚拟机经常进行内存回收,因为虚拟机在内存回收的时候,有的回收算法通常只能运行在一个CPU上。通过Java虚拟机的工具“jstat”可以清楚的看到,Java虚拟机进行内存回收的频率非常高,几乎每5秒中就有一次,每次回收的时间为2秒钟。另外,通过“jstat”的输出还发现每次回收释放的内存非常有限,大多数对象都无法回收。这种现象很大程度上暗示着内存泄漏。使用 Java虚拟机的工具“jmap”来获得当前的一个内存映象。发现有很多(超过10000)个的session对象。这是不正常的一个现象。一般来说, session对应于一个用户的多次访问,当用户退出的时候,session就应该失效,对象应该被回收。当我们和这个系统的开发工程师了解有关 session的设置,发现当他们部署应用的时候,竟然将session的timeout时间设置为50分钟,并且没有提供logout的接口。这样的设置下,每个session的数据都会保存50分钟才会被回收。根据我们的建议,系统提供了logout的链接,并且告诉用户如果退出应用,应该点击这个 logout的链接;并且将session的timeout时间修改为5分钟。通过几天的测试,证明泄漏的问题得到解决。

数据库连接池问题

某财务应用运行在JavaEE服务器上,后台连接Oracle数据库。并发用户数量超过100人左右的时候系统停止响应。通过操作系统层面的进程监控工具发现进程并没有被杀死或挂起,而CPU使用率几乎为零。那么是什么原因导致系统停止响应用户请求呢?我们利用Java虚拟机的工具(kill -3 pid)将当前的所有线程状态DUMP出来,发现JavaEE服务器的大部分处理线程都在等待数据库连接池的连接,而那些已经获得数据库连接的线程却处于阻塞状态。数据库管理员应要求检查了数据库的状态,发现所有的连接的session都处于死锁状态。显然,这是因为数据库端出现了死锁的操作,阻塞了那些有数据库操作的请求,占用了所有数据库连接池中的连接。后续的请求如果还要从连接池中获取连接,就会阻塞在连接池上。当解决数据库死锁的问题之后,性能问题迎刃而解。

时间: 2024-10-29 17:55:48

Java EE应用程序在Glassfish上的性能调优案例分析的相关文章

在 RedHat Linux 上做性能调优

在 RedHat Linux 上做性能调优 性能调优的目的是提高系统性能,减少电力消耗,或者减轻某个应用对系统中其它应用的影响.但是如果贸然地,没有适当的手段进行系统调优,那可能会产生负面效果. 如果我们有系统有计划地进行性能调优,那么它就会成为严谨的科学探索而不是随心所欲的艺术行为. 具体方法 首先我们需要弄明白"正常"的系统性能情形是什么样的. 查找潜在的性能问题并进行参数调优来修复.观察这些调整对系统的影响并决定是否确认保持这种调整或者恢复到调整前的状态. 概要: 收集数据,建立

如何在RedHat Linux上做性能调优

性能调优的目的是提高系统性能,减少电力消耗,或者减轻某个应用对系统中其它应用的影响.但是如果贸然地,没有适当的手段进行系统调优,那可能会产生负面效果. 如果我们有系统有计划地进行性能调优,那么它就会成为严谨的科学探索而不是随心所欲的艺术行为. 具体方法 首先,我们需要弄明白"正常"的系统性能情形是什么样的. 查找潜在的性能问题并进行参数调优来修复.观察这些调整对系统的影响并决定是否确认保持这种调整或者恢复到调整前的状态. 概要: 1.收集数据,建立基准. 2.开启 tuned 功能并选

可预见的Oracle应用程序的性能调优

这篇技巧性文章是由"国际Oracle用户组"(IOUG)提供的,它是一个由用户组成的组织,这个组织通过提供高质量的信息.培训.网络和支持,来提高Oracle数据库专家和数据库开发者的水平.这篇文章摘自由David Welch所写的论文<可预见的Oracle应用程序性能调优>.点击这里成为"国际Oracle用户组"的一员,从而获得成千上万的由Oracle用户写的技巧性文章和科技文献. 引言 我们见到过很多带有巨大性能问题的Oracle应用程序和电子商务套件

使用IBM Rational Application Developer V7.5和WAS V7.0构建Java EE应用程序

使用IBM Rational Application Developer V7.5和WebSphere Application Server V7.0构建Java EE应用程序 引言 本文向您介绍 IBM Rational Application Developer for WebSphere Software V7.5,并带您构建 JPA 实体.session bean,并将它 们部署到 IBM WebSphere V7.0 上. Java Platform, Enterprise Editi

将Flex集成到Java EE应用程序的最佳实践

简介:传统的 Java EE 应用程序通常使用某种 MVC 框架(例如,Struts)作为前端用户界面,随着 Flex 的兴起,基于 RIA 的客户端能够给用户带来更酷的界面,更短的响应时间,以及更接近于桌面应 用程序的体验.本文将讲述如何将 Flex 集成至一个现有的 Java EE 应用程序中,以及如何应用最佳实 践高效率地并行开发 Java EE 和 Flex. 开发环境 本文的开发环境为 Windows 7 Ultimate,Eclipse 3.4,Flex Builder 3.Java

Java程序性能调优的基本知识和JDK调优

一 基本知识 1.1 性能是什么 在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过Java的人都能列出几点,甚至可以夸夸其谈.在<Java TM Platform Performance>一书中,定义了如下五个方面来作为评判性能的标准: 1) 运算的性能--哪一个算法的执行性能最好? 2) 内存的分配--程序运行时需要耗费多少内存? 3) 启动的时间--程序启动需要多长时间?这在Web项目中的影响不大,但要注意部分程序需要部署或运行在客户端时的情形(比如applet程序)

Java 程序性能优化《第一章》Java性能调优概述 1.2性能调优的层次

Java 程序性能优化<第一章>1.2性能调优的层次 为了提升系统性能,开发人员开始从系统各个角度和层次对系统进行优化.除了最常见的代码优化外,在软件架构上.JVM虚拟机层.数据库以及操作系统层面都可以通过各种手段进行优化,从而在整体上提升系统的性能. 1.2.1 设计调优 设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行.在软件开发之处,软件架构师就应该评估系统可能存在的各种潜在问题,并给出合理的设计方案.由于软件设计和架构对整体质量有决定性的影响,所以,设计调优对系统性能的影响

Java 程序性能优化《第一章》Java性能调优概述 1.1性能概述

Java 程序性能调优<第一章>Java性能调优概述(1.1性能概述) 1.1 性能概述 为什么程序总是那么慢?它现在到底在干什么?时间都花在哪里了?也许,你经常会抱怨这些问题,如果是这样,那说明你的程序出了性能问题.和功能问题相比,性能问题在有些情况下,可能不算什么大问题,将就将就,也就过去了.但是严重的性能问题会导致程序瘫痪.假死.直至崩溃.本书就先来认识性能的各种表现和指标. 1.1.1 看懂程序的性能 对客户端程序而言,拙劣的性能会严重影响用户体验,界面停顿.抖动.响应迟钝等问题会遭到

Java 程序性能优化《第一章》Java性能调优概述 1.3基本调优策略和手段

Java 程序性能优化<第一章>1.3基本调优策略和手段 存在性能问题的系统,十之八九是由于某一系统瓶颈导致的.只要找到该性能瓶颈,分析瓶颈的形成原因,对症下药,使用合理的方法解决系统瓶颈,就能从根本上提升性能.所以,系统性能优化的最主要目的就是查找并解决性能瓶颈问题.但同时值得注意的是,性能优化往往会涉及对原有的实现进行较大的修改,因此,很难保证这些修改不引入新的问题.所以,在性能优化前,需要对性能优化的目标.方法进行统筹的安排. 1.3.1 优化的一般步骤 对软件系统进行优化,首先需要有明