十大最常见的Java性能问题

Java性能是所有Java应用程序开发人员都关心的问题,因为快速使应用程序与使其正常运行同等重要。 史蒂文·海恩斯(Steven Haines)使用他在Java性能问题上的个人经验得出的结论是, 大多数问题都有共同的根本原因 。 因此,作为绩效分析师,Haines将基本绩效问题分为三个基本类别:

数据库问题 ,主要与持久性配置,缓存或数据库连接线程池配置有关。

内存问题 ,通常是垃圾回收配置错误或内存泄漏。

并发问题 ,基本上是死锁,网格锁和线程池配置问题。

让我们深入研究每个类别...

数据库

由于数据库是应用程序功能的基本组成部分,因此它也是性能问题的基本根源。 由于对数据库的访问使用错误,连接池大小错误或缺少调整,可能会出现问题。

持久性配置

即使今天Hibernate和其他JPA实现提供了对数据库访问的微调,但仍有一些其他选择(例如急切或延迟获取)可能会导致较长的响应时间和数据库开销。 渴望获取使数据库调用减少了,但变得更加复杂,而懒惰获取使数据库调用变得更加简单和快速。

当应用程序的负载增加并且会导致更大的数据库负载时,就会出现问题。 因此,为了解决此问题,您可以查看业务事务计数器,数据库计数器,但基本上是业务事务与数据库调用之间的相关性。 为避免此类问题,您必须充分了解所使用的持久性技术,正确设置所有配置选项,以便将其功能与您的业务领域需求配对。

快取

缓存优化了应用程序的性能,因为内存中的数据比持久性的​​数据访问速度更快。 当不使用缓存时会引起问题,因此每次需要资源时都会从数据库中检索它。 使用缓存时,由于配置错误,会出现问题。 这里要注意的基本事项是缓存的固定大小和分布式缓存配置。 缓存的对象是有状态的,与提供无状态对象的池不同。 因此,必须正确配置缓存,以免耗尽内存。 但是,如果再次请求移除的对象怎么办? 必须在高速缓存设置以及内存中配置此“未命中”比率。

分布式缓存也可能会引起问题。 将缓存设置为多个服务器时,必须进行同步。 因此,缓存更新将传播到所有服务器中的缓存。 这是实现一致性的方式,但这是一个非常昂贵的过程。 正确使用缓存后,应用程序负载增加不会增加数据库负载,但是当缓存设置错误时,数据库负载会增加,从而导致CPU开销达到均匀的磁盘I / O速率。

为了解决此问题,您应该首先检查数据库性能,以确定是否需要缓存。 然后,您应该使用命中率和未命中率指标来确定缓存大小。 但是,通过在构建应用程序之前正确规划应用程序,可以避免遇到缓存问题。 确保使用序列化和提供可伸缩应用程序的技术。

泳池连接

池连接通常在启动应用程序之前创建,因为它们的创建成本很高。 连接池在事务之间共享,并且池大小限制了数据库负载。

池大小很重要。 没有足够的连接使业务交易等待,数据库使用不足。 另一方面,太多的连接会导致更长的响应时间和数据库过载。 为了解决此问题,您必须检查您的应用程序是在等待新的连接还是要执行数据库查询。 但是,您始终可以通过优化数据库来避免这种情况,使用不同的池大小测试应用程序以检查哪种情况适合。

记忆

内存问题与垃圾收集器和内存泄漏有关。

垃圾收集器

垃圾回收可能会导致所有线程停止以回收内存。 当此过程花费太多时间或发生得太频繁时,就会出现问题。 它的基本症状是CPU峰值和较大的响应时间。 要解决此问题,您可以配置-verbosegc参数,使用性能监视工具来查找发生主要GC的过程,并使用一种工具来监视堆使用情况和可能的CPU峰值。 尽管可以通过配置堆大小和循环JVM来限制它,但是几乎不可能避免该问题。

内存泄漏

Java中的内存泄漏可能以不同于C或C ++的方式发生,因为它们更多地是参考管理问题。 在Java中,即使不再使用对象,也可以保留对对象的引用。 这可能会导致OutOfMemory错误,并要求重新启动JVM。 当内存使用量增加并且堆内存不足时,就会发生内存泄漏问题。 要解决此问题,可以正确配置JVM参数。 为避免必须处理内存泄漏,在对内存泄漏进行编码时应注意-敏感的Java集合或会话管理。 您可以与同事共享内存泄漏避免技巧,让专家查看您的应用程序代码,并使用工具来避免内存泄漏和分析堆。

并发

并发发生在同时执行多个计算时。 Java使用同步和锁来管理多线程。 但是同步可能会导致线程死锁,网格锁和线程池大小问题。

线程死锁

当两个或多个线程试图访问相同的资源,而一个线程正在等待另一个线程释放资源时,则发生线程死锁,反之亦然。 发生死锁时,JVM将耗尽所有线程,并且应用程序会变慢。 死锁很难重现。 因此,解决死锁问题的一种方法是在两个线程死锁时捕获线程转储,并检查线程的堆栈跟踪。 为避免此问题,您最好使您的应用程序及其资源尽可能不变,使用同步并检查潜在的线程交互。

线程僵局

当使用过多的同步并因此花费太多时间等待单个资源时,可能会发生线程僵局。 要注意这一点,您必须同时具有较慢的响应时间和较低的CPU使用率,因为许多线程尝试访问同一代码部分,并且它们正在等待具有该代码部分的代码部分完成。 那么,您该如何解决呢? 您必须首先检查线程在哪里等待以及原因。 然后,您应该根据业务需求消除同步要求。

线程池配置锁

当应用程序使用应用程序服务器或Web容器时,线程池用于控制并发处理的请求。 如果此线程池很小,则请求将等待很多,但是如果线程池太大,则处理资源将变得很忙。 因此,在较小的池中,CPU利用率不足,但线程池利用率为100%,而在较大的池中,CPU则非常繁忙。

您可以通过检查线程池利用率和CPU利用率并确定是增大还是减小池大小来轻松解决此问题 。 为了避免这种情况,您必须调整线程池,但这并非那么容易。

最后,可能发生的两个基本问题是事后考虑的性能问题,或最终用户会注意到的性能问题。

第一种情况是一个常见问题。 通常,开发人员会创建一个可以正常运行但在性能测试中失败的应用程序。 为了解决这个问题,他们通常必须对应用程序进行体系结构审查,而性能分析工具似乎非常方便。 为避免此问题,请在开发应用程序时尝试测试性能,因此持续集成是关键。

应用动力学性能 对于第二种情况,当应用程序的最终用户通知您存在性能问题时会发生什么? 有避免这种情况的工具,例如JMX来检查服务器的行为。 商业交易绩效结果与JMX结果结合在一起也可能会有所帮助。 方法级响应时间检查业务事务中调用的所有方法,并找到应用程序的热点。 因此,最好使用这些工具之一,以使最终用户永远不会警告您性能。

有兴趣了解更多吗? 然后,您应该在此处下载相关的电子书。

翻译自: https://www.javacodegeeks.com/2015/02/top-10-common-java-performance-problems.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D 访问Access数据库

Unity3D 访问Access数据库 在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来。写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是…

LaTeX 基础笔记。开篇

LaTeX 的起源非常牛逼,有一套书大家可能听说过《计算机程序设计艺术》,写了好几本。当然能在计算机方面写上艺术俩字的书恐怕不是我们一般人能读懂得东西了。他的作者在1976年准备写第二卷的时候发现计算机的排版非常难看,所以,为…

Java旧版不断发展

我最近偶然发现了JDK API的一个非常有趣的警告&#xff0c;即Class.getConstructors()方法。 它的方法签名是这样的&#xff1a; Constructor<?>[] getConstructors()有趣的是&#xff0c; Class.getConstructor(Class...)返回一个Constructor<T> &#xff0c;并…

带Lambda表达式的Apache Wicket

这是怎么回事&#xff1f; :) 我一直在从事一些项目&#xff0c;这些项目值得庆幸的是将Apache Wicket用于表示层。 我自然想到Java的8个lambda表达式如何与Wicket完美匹配。 而不仅仅是我&#xff0c; Wicket团队似乎已经在努力更改API&#xff0c;以为开箱即用的lambda提供支…

装饰者模式如何拯救了我的一天

在工作中&#xff0c;我正在处理庞大的Java代码库&#xff0c;该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成&#xff0c;但是同时我通常没有机会重构遇到的每一个奇怪之处。 尽管如此&#xff0c;仍可以每天采取提高代码质量的措施。 …

快速的骆驼和云消息传递

Apache Camel是一个流行的&#xff0c;成熟的开源集成库。 它实现了企业集成模式 &#xff0c;这是在集成分布式系统时经常出现的一组模式。 过去&#xff0c;我写过很多关于Camel的文章&#xff0c; 包括为什么我比Spring Integration更喜欢它 &#xff0c; 路由引擎 如何 工作…

三角形类1

/* 程序的版权和版本声明部分 Copyright (c)2012, 烟台大学计算机学院学生 All rightsreserved. 文件名称&#xff1a; object.cpp 作者&#xff1a;刘清远 完成日期&#xff1a; 2013年3月29日 版本号&#xff1a; v1.0 输入描述&#xff1a;无 问题描述&#xff1a;设计求三…

android 自定义xml属性

Android 自定义组件 Android 提供了非常精致的和非常强大的组件化模型&#xff0c;能够更加方便的构建UI,这些UI组件都是基于基本的layout类:View 和 ViewGroup。 部分能够用的widgets包括&#xff1a;Button&#xff0c;TextView,EditText,ListView,CheckBox&#xff0c;Radio…

LeetCode: Longest Common Prefix

string.erase没掌握好&#xff0c;悲了个剧&#xff0c;2次过 1 class Solution {2 public:3 string longestCommonPrefix(vector<string> &strs) {4 // Start typing your C/C solution below5 // DO NOT write int main() function6 s…

流式传输大数据:Storm,Spark和Samza

有许多分布式计算系统可以实时或近实时处理大数据。 本文将从对三个Apache框架的简短描述开始&#xff0c;并试图对它们之间的某些相似之处和不同之处提供一个快速的高级概述。 阿帕奇风暴 在风暴 &#xff0c;你设计要求的T opology实时计算的图&#xff0c;然后喂到集群&…

uniapp使用阿里云多色图标

下载&#xff0c;然后解压 输入cmd&#xff0c;然后enter 输入 npm install -g iconfont-tools 再输入 iconfont-tools&#xff0c;然后一直enter&#xff0c;直到结束 目录会多了个iconfont-weapp文件&#xff0c;点击去找到 iconfont-weapp-icon.css 导入和使用 t-icon开头 接…

针对Java中的XSD验证XML

有许多工具可用于根据XSD 验证XML文档 。 其中包括操作系统脚本和工具&#xff0c;例如xmllint &#xff0c;XML编辑器和IDE&#xff0c;甚至是在线验证器。 由于前面提到的方法的局限性或问题&#xff0c;我发现拥有自己的易于使用的XML验证工具很有用。 Java使编写这样的工具…

uniapp uni.request GET方式请求,不能直接传数组解决方法

这里写目录标题目录遇到的问题 GET请求方法传数组解决方案目录 遇到的问题 GET请求方法传数组 想传一个数组&#xff0c;但是后台接受到的数据与浏览器中显示的数据和前台代码传的不一样&#xff1b; 前台代码打印 浏览器显示数据 其中HerbalNameList &#xff0c;变成了字…

休眠CascadeType.LOCK陷阱

介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 &#xff0c;就该分析CascadeType.LOCK行为了。 休眠锁定请求触发内部LockEvent 。 关联的DefaultLockEventListener可以将锁定请求级联到锁定实体子级。 由于CascadeType.ALL也包括CascadeType.LOCK &#xff0c;因…

c++中在堆和栈中申请空间的差别

堆中和栈中申请的空间的比较, 我找到了下面的比较: 栈的情况&#xff1a;栈上分配空间的好处是快&#xff0c;而且对象生存期是自动的&#xff0c;离开当前域之后就自动析构回收。坏处就是栈空间有限&#xff0c;而且不能人为控制对象的生存期&#xff0c;比如你无法将一个函数…

推销自己的海盗猫王运营商

因此&#xff0c;Java没有Elvis运算符&#xff08;或者更正式的名称是null合并运算符或null安全成员选择&#xff09;……虽然我个人不太在意它&#xff0c;但有些人似乎很喜欢它。 当一位同事需要几天后&#xff0c;我坐下来探讨了我们的选择。 而且你知道什么&#xff01; 您…

使用CDI简化JAX-RS缓存

这篇文章&#xff08;通过一个简单的示例&#xff09;说明了如何使用CDI Producers使其在RESTful服务中利用缓存控制语义更加容易 与HTTP 1.0中可用的Expires标头相比&#xff0c; HTTP 1.1中添加了Cache-Control标头&#xff0c;这是急需的改进。 RESTful Web服务可以利用此标…

transform限制position:fixed的跟随效果

我们应该都知道&#xff0c;position:fixed可以让元素不跟随浏览器的滚动条滚动&#xff0c;而且这种跟随效果连它的兄弟们position:relative/absolute都限制不了。但是&#xff0c;真是一物降一物&#xff0c;position:fixed固定效果却被小小的transform给干掉了&#xff0c;直…

Java 8 Lambda表达式教程

问候&#xff01; :) 离开几个月后&#xff0c;我决定恢复风格:)。 我注意到我以前有关新的Date / Time API的一篇文章非常受欢迎&#xff0c;因此这次我将把本篇文章专门介绍Java 8的另一个新功能&#xff1a; Lambda Expressions 。 功能编程 Lambda表达式是Java编程语言最…

[HDU] 2553 N皇后问题-简单深搜

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2553 方法&#xff1a; 1.可以用对称的思想&#xff0c;即&#xff1a;如果N是偶数&#xff0c;则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和&#xff0c;最后再乘以2。如果是奇数&#…