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

java常见性能优化

java常见性能优化_十大最常见的Java性能问题相关推荐

  1. java 性能 优化_Java十大简单性能优化

    java 性能 优化 关于" web scale "这个流行词有很多炒作,人们花了很多时间来重新组织他们的应用程序体系结构,以使其系统"规模化". 但是什么是扩 ...

  2. JAVA十大排序算法动画_十大排序算法(java实现)

    [前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...

  3. 性能:性能优化的十大策略

    时空转换 时间换空间 场景: 一个系统的最大性能瓶颈如果是内存使用量,那么减少内存的使用就是最重要的性能优化.这时可以用时间换空间 降低数据的大小以方便网络传输和外部存储:如果系统的瓶颈在网络传输速度 ...

  4. mysql 性能分析_十大MySQL性能分析工具汇总!专治MySQL性能瓶颈

    前言 MySQL 数据库最常见的两个瓶颈是CPU和I/O的瓶颈.CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候,磁盘I/O瓶颈发生在装入数据远大于内存容量的时候. MySQL数据库性能 ...

  5. vlookup匹配值不唯一_十大Vlookup常见错误!

    周二 · 函数关键词:Vlookup Vlookup是我们工作中最常用的函数,倘若使用不当,可能会带来不少麻烦. 如果你已掌握了Vlookup基本用法(链接),来看看下面这些错误是否都避开了? 1错误 ...

  6. java反射 虚拟机优化_面试官问我:Java反射是什么?我回答竟然不上来......

    每天凌晨00点00分,第一时间与你相约 每日英文 We all have moments of desperation. But if we can face them head on, that's ...

  7. 十大排序算法(Java)

    文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...

  8. 学完Java后可从事的十大领域!

    Java是时下非常流行的语言,这意味着有很多很多不同的工作可供选择.Java软件工程师入行1-3年,年薪已达到10-15万,而且在IT行业工作经验越多,薪资待遇越高. 工作选择多,薪资待遇好,成了许多 ...

  9. Web性能优化:基本思路和常见工具

    Web性能优化 听了荣华的演讲之后,我对性能优化有了更深层次的认识. 性能优化的重要性 性能优化是为了赢得用户,为了降低成本. 性能优化思路 Web常见优化点 Java常见排查工具

最新文章

  1. Rancher使用入门
  2. life science 研究领域之生物信息学
  3. c语言中的无符号字节,C语言之有符号数和无符号数
  4. 什么样的项目经历会让面试官眼前一亮
  5. 【Web】JavaWeb开发技术笔记整理
  6. 微信皮肤css,微信小程序实现皮肤功能(夜间模式)_婳祎_前端开发者
  7. 子图同构算法系列(1)
  8. 【NOIP模拟】矩阵
  9. python 求点到线段距离
  10. 万特电能表接线仿真系统 软件_电工学习PLC和接线入门 之 无中生有(软件仿真)...
  11. python修改文件的某一行_简单文件操作python 修改文件指定行的方法
  12. Yalmip:踩坑记录/窍门分享
  13. (SCI论文写作)三种高效的论文用公式编辑器推荐(Word、mathtype、亿图公式编辑器)
  14. POI导出word文件中表格合并方法(行合并,列合并)
  15. vue项目中加载使用腾讯地图
  16. neko虚拟机对象文档与扩充
  17. 『互联网架构』软件架构-深入理解Ribbon
  18. Python三方微博登录
  19. web入门 命令执行 web42-web52
  20. python系列之---python的起源

热门文章

  1. jzoj5365-[GDOI2018模拟9.14]通信【线段树合并】
  2. ssl提高组周四备考赛【2018.10.18】
  3. 【2018.4.7】模拟赛之六-ssl2387 树【图论,树】
  4. 【线段树】Frog Traveler(CF751D)
  5. 【贪心】逃跑(jzoj 1748)
  6. 2017上海金马五校赛 丢史蒂芬妮 博弈问题
  7. 14、mysql中事务的应用
  8. 36、JAVA_WEB开发基础之监听器
  9. Apache Druid(一)简介
  10. Hibernate之必须导入jar包