基于技术的等待点
基于层次的等待点考虑的是在不同服务器之间传递请求,而基于技术的等待点关注的则是在单个服务器中如何通过有效地内部工作来传递请求。基于层次的调优,类似于IBM的队列调优,只是调整应用的有效第一步,如果忽略了调优应用服务器的内部工作,则会对应用性能产生巨大的影响。这就类似于调整JDBC连接池以发送最佳数量的负载给数据库,但是忽略了检查执行的SQL语句——如果查询需要连接十个表单,每个表单有一百万个记录,则最佳负载可能是两个连接,但是如果我们优化了查询,则数据库可能支持二百个连接。深入研究应用服务器和应用使用的潜在技术,可能存在以下通用的基于技术的等待点:
● 池对象(比如无状态session bean或者其他应用放入池的业务对象)
● 缓存设施
● 持久化存储 或外部依赖池
● 通讯基础设施
● 垃圾收集
大多数情况下,无状态session bean池的大小被应用服务器优化,不会是一个明显的等待点,除非池大小被手工错误的配置了。但是也存在一些池对象必须手动配置大小——这些可能成为有效的等待点。当一个应用需要一个池化的资源,它必须从池里获取一个资源实例,使用它,然后释放给池。如果池太小,所有的对象实例都在被使用,则请求不得不等待一个实例可用。显而易见,等待一个池化的资源会增加响应时间,如果越来越多的请求被堵塞在等待池化资源,会导致明显的性能下降。另一方面,如果池很大,它可能消耗过多内存,对总体JVM的性能产生差的影响。池的最佳大小需要权衡,只能在对池的利用情况做彻底的分析才能决定。
池化对象是无状态的,这意味着应用从池中得到哪个实例都无所谓——任何实例都行。另一方面,缓存的对象都是有状态的,也就是说当应用从缓存中请求一个对象时,它的目标是一个特定对象。举一个很粗糙的类比说明一下区别:考虑人们生活当中两种常见的活动:超市购物和接孩子放学。在超市中,任何收银员都可以接待每一位顾客,无论顾客选择哪位收银员都可以顺利结账。因此收银员可以池化。但是在接孩子放学时,每一个父母只想要他们自己的孩子,别的孩子是不行的。因此孩子可以被缓存。
如前面所述,缓存提出了一个新的调优挑战。简单说,缓存的目的是在本地内存中存储对象,使应用可以随时读取它们,而不是在需要的时候才获取他们。一个合适大小的缓存可以对通过远程调用加载对象的行为提供明显的性能改善。但是,一个不合适大小的缓存,可能产生明显的性能阻碍。因为缓存维护有状态的对象,所以重要的一点是在缓存中存储最频繁访问的对象,同时保留额外的空间来处理非频繁访问对象。试想如果缓存太小,请求会怎样:
1、请求检查缓存中是否存在某对象,结果失败。
2、请求需要查询外部资源获取对象数据。
3、因为缓存通常维护最频繁访问的数据,所以这个新对象需要添加到缓存中(它正在被访问)。
4、但是如果缓存满了,必须利用“最少最近访问”算法选择一个对象移除。
5、如果缓存对象的状态与外部资源不一致,则缓存对象移除之前必须更新外部资源。
6、新的对象此刻添加到缓存中。
7、新的对象最终返回给请求。
这是一个低效的过程,如果大多数请求都要执行这些步骤,那么缓存肯定会降低性能。缓存必须调整到足够大以最小化缓存的“不命中率”,一次不命中意味着需要执行前面提到的七个步骤,但是也不能太大导致占用太多JVM内存。如果缓存需要非常非常大才能满足性能需要,那么最好是重新考虑被缓存对象的实质和它们到底是否值得缓存。
类似对象池,外部资源池,比如数据库连接池,也必须足够大以满足请求不会被迫等待池中的一个连接变为可用状态,但是也不能太大,导致应用浪费外部资源。“后退调优”一节讨论了如何决定这些池的最佳大小,但是在本节的上下文中,牢记它们代表了一个明显的等待点。
调优通讯基础设施远远超出了本文讨论的范围,因为其具体实现因产品不同而存在明显的区别,这包括诸如MSMQ、MQSeries、TIBCO等主流产品。但是请记住,如果一个应用与某消息服务器交互,它必须经过合适的调优或者它也代表了一个等待点。
最后一个明显影响JVM性能的等待点是垃圾收集。它不太适用本文中描述的等待点分析过程(检查一个请求,定位导致该请求等待的技术),但是由于它可以对性能产生显著的影响,所以把它列在这里。不同的JVM实现和不同的垃圾收集策略决定了垃圾收集如何执行,但是在很多情况下,一次主垃圾收集(或者说标记—清除—压缩垃圾收集)可能导致整个JVM暂停直到垃圾收集完成。一个显著提高JVM性能的办法就是优化垃圾收集。如果想了解更多垃圾收集的信息,请加入GeekCap讨论应用基础设施调优。
更多信息请查看 java进阶网 http://www.javady.com
分享到:
相关推荐
### Java性能调优知识点概述 #### 一、高性能Java代码编写原则 - **算法与数据结构**:选择合适的数据结构可以极大地提升程序运行效率。例如,对于查找操作频繁的场景,哈希表(如`HashMap`)比链表或数组更高效。...
Java性能调优是一种针对Java应用程序进行优化以提升其运行效率和响应速度的技术。现代企业级Java应用具有高度的复杂性,涉及多种输入源、多输出形式、复杂的框架和业务处理引擎,这使得调优变得尤为困难。过去,基于...
### 生产环境下的Java排错调优 #### 开源力量公开课第1期——生产环境下的Java排错调优 本次公开课由施懿民老师主讲,聚焦于生产环境下的Java排错与性能优化,这对于提高Java应用的稳定性和效率至关重要。 #### ...
性能调优对于确保应用高效运行至关重要,尤其是对于处理高并发和大数据量的应用来说。本文将深入探讨“WAS性能调优对jvm、线程数、ORB大小的配置”这一主题。 首先,我们要理解JVM(Java Virtual Machine)在WAS中...
### Java性能测试与调优案例 #### JDK优化 在Java应用开发过程中,为了提升程序运行效率及稳定性,对JDK的优化尤为重要。JVM(Java虚拟机)作为Java程序运行的基础,其性能直接影响到应用程序的表现。JVM有两种...
在CMT(Chip Multi-Threading)平台上对Java应用进行性能优化是一个复杂且具有挑战性的过程,尤其是在处理高并发、大规模用户访问的场景下。本文将深入探讨如何在CMT架构下,通过调整JVM参数、优化多线程设计以及...
本文档旨在探讨Java企业版(Java EE)环境下性能调优的最佳实践,包括方法论、负载测试工具、软件栈中的各组件调优策略以及未来性能趋势展望。 #### 二、方法论与过程 ##### SunTone-3D 应用方法论 SunTone-3D 是...
VisualVM是一款强大的Java性能分析工具,它由Oracle公司提供,是Java开发者进行性能调优的重要助手。本资料包含的源码是VisualVM针对Java应用程序的CPU硬件资源管理部分,通过分析这些源代码,我们可以深入了解Java...
Java性能分析工具,如JProfiler,是开发人员和系统管理员在优化Java应用程序时的重要武器。JProfiler是一款功能强大的Java性能剖析器...无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的Java性能调优技能。
4. **Java性能调优**: - VisualVM支持JMX(Java Management Extensions),允许动态修改JVM参数,对于性能优化来说极其方便。 - 它还可以导出CPU和内存快照,用于离线分析,帮助开发者理解应用在特定时刻的资源...
11. **并发性能调优**:书中还会讨论如何监控和优化并发程序的性能,包括JVM的并发参数调整、线程池的配置以及并发工具的使用等。 通过学习《Java并发编程:设计原则与模式(第二版)》,开发者可以掌握Java并发...
5. **性能调优**:`hbase.client.operation.timeout`和`hbase.rpc.timeout`定义了操作和RPC超时时间,防止长时间阻塞。`hbase.region.split.policy`选择合适的分裂策略,如`ConstantSizeRegionSplitPolicy`或`...
Java性能管理系统是一个基于Java技术构建的应用程序,用于管理和优化软件系统的性能。在Java环境中,性能管理涉及监控、分析和调优多个层面,包括CPU使用率、内存管理、线程活动、垃圾回收、数据库连接以及网络I/O等...
7. **性能调优策略**:基于javapms的数据,我们可以采取以下调优策略: - **内存调优**:调整JVM的内存分配,优化新生代和老年代的大小。 - **线程优化**:合理设置线程池大小,避免过多线程导致的资源消耗。 - *...
数据库性能调优涉及SQL优化、索引调整、资源分配、查询缓存和配置参数调整等多个方面。 查询优化器分析和选择执行查询的最佳路径,以最大化性能,它是数据库管理系统的关键组件。 数据库连接池的配置和使用涉及...