java常见性能优化_十大最常见的Java性能问题

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常见性能优化

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

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

相关文章

为甚 html 显示为源码,显示字符串作为美化HTML源代码

我正在开发一个ASP.NET MVC Web应用程序。在一个页面上,我有一个字符串,如下所示:This is some text !对于预览模式,我使用Html.Raw(Model.MyText),文本显示为呈现的HTML:此是一些文字!我现在想…

C语言 | 链表概述

C语言链表概述链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构,是根据需要开辟内存单元。链表有一个“头指针”变量,它存放一个地址,该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部…

笔记本电脑频繁自动重启_如何解决电脑频繁自动重启

电脑频繁自动重启的原因可能是系统问题,也可能是电脑硬件出现问题,需要经过仔细排查才能找到自动重启的原因。电脑频繁自动重启的原因一、显卡或CPU温度过高当显卡和CPU的温度达到一定温度以后,主板就会启用自动保护功能,使电脑重…

jooq_jOOQ与Hibernate:何时选择哪个

jooqHibernate已成为Java生态系统中的事实上的标准,事实上, 如果标准对您很重要 ,并且如果您将JCP与ISO,ANSI,IEEE等置于同一级别,那么Hibernate也是实际的JavaEE标准实现。 本文的目的不是讨论标准&#…

html5编辑器新手用,3款容易上手的HTML5编辑工具推荐~

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我们的生活已经时刻可见H5页面的身影,从美食到用车、从购物到求职,可以说HTML5技术对我们生活的影响是颠覆性的。今天小编就给大家推荐5款容易上手的H5页面,大家可以通过自己制作H5页面来感受一下…

C语言 | 循环语句总结

C语言循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环体中还可以嵌套循环,这就是多层循环。3种常用循环语句:while语句、do...while语句和for语句可以相互嵌套。C语言循环的比较3种循环语句都可以用来处理同一…

python 死循环程序能占满cpu吗_运行tensorflow python程序,限制对GPU和CPU的占用操作...

一般情况下,运行tensorflow时,默认会占用可以看见的所有GPU,那么就会导致其它用户或程序无GPU可用,那么就需要限制程序对GPU的占用。并且,一般我们的程序也用不了所有的GPU资源,只是强行霸占着,…

java 不规则 拼图_Java中不一致的操作会扩大规则

java 不规则 拼图总览 当您在Java中执行一元或二进制运算时,标准行为是使用最宽的操作数(或对于byte , short和char ,使用更大的操作数)。 这很容易理解,但是如果考虑最佳类型可能会造成混淆。 乘法 当执行…

账户的配置使您无法使用该计算机,2个方法解决“user profile service服务未能登录无法加载用户配置文件”...

win8/10系统:启动电脑显示windows标志时,长按电源键强行关机,重复此操作三次,系统将会进入“自动修复”。然后在“自动修复”界面中,选择“高级选项”>“疑难解答”>“高级选项”>“启动设置”>“重启”&a…

endp 汇编start_飞思卡尔Kinetis L 汇编语言启动文件startup_MK25Z4简单分析

打开Freedom KL25的例程包,任意找一个code example,以lower_power_dma_uart_demo为例,分析一下启动汇编文件的代码。代码主要分三部分:堆栈等的配置、向量表、初始启动跳转。1. 堆栈配置; Stack Configuration; Stack Size (in …

自定义ui_如何允许用户自定义UI

自定义ui理念 利用JavafX / FXML的声明性设计模式,并允许用户仅通过使用例如SceneBuilder打开某个视图即可重新定制布局或添加新控件,甚至根据用户需要更改样式,从而无需任何编码即可自定义某个视图。 FXML文件 CSS基本上可以放置在通过URL可…

C语言 | 内部与外部函数

C语言函数的声明和定义一个函数一般由两部分组成:声明部分执行语句C语言对变量而言,声明与定义的关系稍微复杂一些,在声明部分出现的变量有两种情况:一种是需要建立存储空间的。另一种是不需要建立存储空间的。前者称为定义性声明…

进程和线程计算机组成原理面试题,2016年云南财经大学信息学院计算机组成原理复试笔试最后押题五套卷...

一、选择题1. 设文件索引节点中有7个地址项,其中4个地址项为直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接地址索引,每个地址项大小为4字节,若磁盘索引块和磁盘数据块的大小均为256字节&a…

获取客户端ip_代理IP工具能否解决反爬?

互联网已成了生活中的部分,从事互联网的工作者,避免不了需要去一些网站上进行爬取需要的数据来达到自己产品或者业务上的需求。比如反爬策略,但是,使用代理IP工具一定可以解决反爬虫策略吗?一、不同的网站有不同的反爬…

C语言 | 结构体数组

C语言结构体数组概述一个结构体变量中可以存放一组有关联的数据,如一个学生的学号、姓名、成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与之前介绍的数值型数组的不同之处在于每个数…

html弹窗代码y\/n,Nodejs扩展,实现消息弹窗(示例代码)

模块的C代码 node_gtknotify.cc#include #include #include #include #include using namespace v8;class GtkNotify : node::ObjectWrap{public:GtkNotify(){}~GtkNotify(){}std::string title;std::string icon;static Persistent persistent_function_template;static void …

LeetCode 每日一题 Day 21|| 堆

1962. 移除石子使总数最小 给你一个整数数组 piles ,数组 下标从 0 开始 ,其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k ,请你执行下述操作 恰好 k 次: 选出任一石子堆 piles[i] ,并从中 移除 floo…

python脚本语言采用声音作为手段_LKJ自动化测试脚本定义及生成技术研究

LKJ自动化测试脚本定义及生成技术研究白鸿钧,张明凯,李冠军,杨清祥【摘要】摘要:为实现对列车运行控制系统软件的自动化测试,在通用脚本语言的基础上定义专用的脚本语言,讨论专用脚本语言的结构和组成&…

java ee jsp_EE JSP:Servlet的反向外套

java ee jsp仅当页面数量少或需要对生成的内容(二进制PDF等)进行精细控制时,才可以从Servlet生成HTML。 对于大多数应用程序,输出将是HTML,我们需要一种更好的方法来完成此操作。 这就是JSP(Java服务器页面…

C语言 | 结构体指针

C语言指向结构体变量的指针在C语言中,指向结构体对象的指针变量既可以指向结构体变量,也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。C语言中允许 (*p).num用p->num来代替 ->代表一个箭头 p-&g…