qt如何捕获应用程序输出_企业应用程序中需要捕获的5大Java性能指标

qt如何捕获应用程序输出

有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗? 立即开始免费试用 !

前几篇文章介绍了应用程序性能管理(APM),并指出了有效实施APM战略的挑战。 本文通过回顾五个顶级性能指标来构建这些主题,以评估您的企业Java应用程序的运行状况。

本文专门回顾以下内容:

  • 商业交易
  • 外部依赖
  • 缓存策略
  • 垃圾收集
  • 应用拓扑

1.商业交易

商业交易提供了对真实用户行为的洞察力:它们捕获了真实用户在与您的应用程序进行交互时所经历的实时性能。 如前一篇文章所述,衡量业务交易的绩效涉及全面捕获业务交易的响应时间以及测量其组成层的响应时间。 然后,可以将这些响应时间与最能满足您的业务需求的基线进行比较以确定正常性。

如果您仅要评估应用程序的一个方面,则建议您评估业务交易的行为。 容器度量标准可以提供大量信息,并可以帮助您确定何时自动扩展环境,而业务交易则决定了应用程序的性能。 而不是询问应用程序服务器中的线程池使用情况,您应该询问您的用户是否能够完成其业务交易,以及那些业务交易是否正常进行。

作为一点背景,业务交易由它们的入口点来标识,这是与启动业务交易的应用程序的交互。 可以通过诸如Web请求,Web服务调用或消息队列中的消息之类的交互来定义业务交易入口点。 或者,您可以选择基于URL参数为同一Web请求定义多个入口点,或者根据其正文内容为服务调用定义多个入口点。 关键是,业务交易需要与对您的业务有意义的功能相关。

一旦确定了业务交易,便会在整个应用程序生态系统中衡量其性能。 对照其基线评估每个单独业务交易的绩效以评估正常性。 例如,我们可以确定业务交易的响应时间是否比行为异常的基线的平均响应时间慢两个标准偏差。

图1根据基准评估BT响应时间

图1根据基准评估BT响应时间

用于评估业务交易的基准在业务交易运行的小时数内是一致的,但是通过每次业务交易执行来完善业务交易。 例如,如果您选择的基准将一天中的某小时和一周中的某天的平均响应时间与业务交易进行比较,则在当前时间结束后,该小时内执行的所有业务交易将被合并到该基准中下周。 通过这种机制,应用程序可以随着时间的推移而发展,而无需丢弃和重建原始基准。 您可以将其视为随时间推移的窗口。

总而言之,业务交易是对用户体验的最具反映性的度量,因此它们是要捕获的最重要的指标。

2.外部依赖

外部依存关系可以有多种形式:依存的Web服务,遗留系统或数据库; 外部依赖关系是您的应用程序与之交互的系统。 我们不必控制在外部依赖项中运行的代码,但是我们经常可以控制那些外部依赖项的配置,因此了解何时以及何时运行得很好很重要。 此外,我们需要能够区分应用程序中的问题和依赖关系中的问题。

从业务交易的角度来看,我们可以识别和衡量外部依存关系在它们自己的层中。 有时我们需要配置监视解决方案以识别真正包装外部服务调用的方法,但是对于常见协议(例如HTTP和JDBC),可以自动检测到外部依赖关系。 例如,当我在一家保险公司工作时,我们拥有一台AS / 400,并且使用专有协议与之通信。

我们将方法调用确定为外部依赖项,并将其执行归因于AS / 400。 但是我们也有可以为我们自动识别的Web服务调用。 与业务交易及其组成的应用程序层类似,应将外部依赖行为作为基准,并根据这些基准评估响应时间。

业务事务为您提供了应用程序性能的最佳整体视图,可以帮助您处理性能问题,但是外部依赖项可能会以意想不到的方式对应用程序产生重大影响,除非您正在观察它们。

3.缓存策略

从内存中服务对象总是比通过网络调用从数据库等系统中检索对象要快。 缓存提供了一种在本地存储对象实例的机制,从而避免了这种网络往返。 但是,如果配置不正确,则缓存可能会带来自身的性能挑战。 常见的缓存问题包括:

  • 将太多数据加载到缓存中
  • 缓存大小不正确

我与一群不喜欢一般对象关系映射(ORM)工具,特别是不喜欢Level-2缓存的人一起工作。 共识是,ORM工具在决定将哪些数据加载到内存中时过于宽松,并且为了检索单个对象,该工具需要将大量相关数据图加载到内存中。 当正确配置工具时,他们对这些工具的担心几乎没有根据,但是他们发现的问题是真实的。 简而言之,当应用程序只需要该数据的一小部分时,它们就不喜欢将大量相互关联的数据加载到内存中。

在衡量高速缓存的性能时,需要确定加载到高速缓存中的对象数,然后跟踪正在使用的那些对象的百分比。 要查看的关键指标是高速缓存命中率和从高速缓存中弹出的对象数。 高速缓存命中计数或命中率报告从高速缓存中服务的对象请求的数量,而不需要进行网络行程来检索对象。

如果高速缓存很大,则命中率很小(低于10%或20%),并且您看不到从高速缓存中弹出许多对象,那么这表明您正在向高速缓存中加载太多数据。 换句话说,您的缓存足够大,不会抖动(请参阅下文),并且包含许多未使用的数据。

测量缓存性能时要考虑的另一个方面是缓存大小。 如上例所示,缓存是否太大? 缓存是否太小? 还是缓存大小合适?

调整缓存大小时的一个常见问题是无法正确预期用户的行为以及缓存的使用方式。 让我们考虑配置为承载100个对象的缓存,但该应用程序在任何给定时间需要300个对象。 前100个调用会将初始对象集加载到缓存中,但随后的调用将找不到他们要查找的对象。 结果,缓存将需要选择要从缓存中删除的对象,以便为新请求的对象腾出空间,例如使用最近最少使用(LRU)算法。

该请求将需要通过网络执行查询以检索对象,然后将其存储在缓存中。 结果是我们花费更多的时间来管理缓存而不是服务对象:在这种情况下,缓存实际上是在阻碍而不是提高性能。 由于Java的性质以及它如何管理垃圾回收,进一步加剧了问题,这种从缓存中不断添加和删除对象的方法实际上会增加垃圾回收的频率(请参阅下文)。

当您将高速缓存的大小设置得太小并且发生上述行为时,我们说高速缓存正在抖动,在这种情况下,没有高速缓存比抖动的高速缓存更好。 图2试图以图形方式显示。

图2缓存释放

图2缓存释放

在这种情况下,应用程序从缓存中请求一个对象,但是找不到该对象。 然后,它通过网络在外部资源中查询对象,并将其添加到缓存中。 最后,缓存已满,因此需要选择一个要从缓存中弹出的对象,以便为新对象腾出空间,然后将新对象添加到缓存中。

有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗? 立即开始免费试用 !

4.垃圾收集

从最初发布到Java所提供的核心功能之一就是垃圾收集,这既是福也是祸。 垃圾回收使我们摆脱了手动管理内存的责任:完成使用对象后,我们只需删除对该对象的引用,垃圾回收将自动为我们释放它。 如果您使用的是需要手动内存管理的语言(例如C或C ++),那么您会发现,这减轻了分配和释放内存的麻烦。

此外,由于垃圾回收器在没有对该内存的引用时自动释放内存,因此它消除了在分配内存并在释放内存之前删除对该内存的引用时发生的传统内存泄漏。 听起来像万灵药,不是吗?

垃圾收集实现了消除手动内存管理并使我们摆脱传统内存泄漏的目标,但这样做的代价是有时会很麻烦。 有几种基于您使用的JVM的垃圾收集策略,并且不涉及本文的讨论范围,但是足以说明您需要了解垃圾收集器的工作方式以及实现垃圾收集的最佳方法。配置它。

垃圾收集的最大敌人被称为大型或完整垃圾收集。 除了Azul JVM之外,所有JVM都遭受主要垃圾回收的困扰。 垃圾收集有两种一般形式:

  • 次要
  • 重大的

小型垃圾收集相对频繁地发生,目的是释放短暂的对象。 它们在运行时不会冻结JVM线程,并且通常不会产生重大影响。

另一方面,主要的垃圾收集有时也称为“世界停止”(STW)垃圾收集,因为它们在运行时会冻结JVM中的每个线程。 为了说明这种情况是如何发生的,我在本书《 Pro Java EE 5性能管理和优化》中提供了一些数据。

图3可达性测试

图3可达性测试

运行垃圾回收时,它将执行称为可达性测试的活动,如图3所示。它构造对象的“根集”,其中包括每个运行线程直接可见的所有对象。 然后,它遍历由根集中的对象引用的每个对象以及由这些对象引用的对象,依此类推,直到所有对象都被引用为止。 在执行此操作时,它“标记”活动对象正在使用的内存位置,然后“清除”所有未使用的内存。 更恰当地说,它从根集中释放了没有对象引用路径的所有内存。 最后,它压缩或整理内存碎片,以便可以分配新对象。

次要集合和主要集合取决于Java虚拟机,但图4和5显示了次要集合和主要集合在Sun JVM上的运行方式。

图4次要收藏

图4次要收藏

在次要收集中,将在Eden空间中分配内存,直到Eden空间已满。 它执行一个“复制”收集器,将活动对象(可达性测试)从伊甸园复制到两个幸存者空间之一(到空间和从空间)。 然后可以将留在伊甸园中的物体扫走。 如果幸存者空间已满,而我们仍然有活动对象,则这些活动对象将被移至保管空间,在那里只有大集合可以释放它们。

图5主要收藏

图5主要收藏

最终,保有权空间将被填满并运行次要收集,但是保管空间中将没有任何空间可复制不适合幸存者空间的活动对象。 发生这种情况时,JVM冻结JVM中的所有线程,执行可达性测试,清除年轻的一代(Eden和两个幸存者空间),并压缩保有空间。 我们称此为主要收藏。

如您所料,堆越大,大型集合的运行频率就越低,但是当运行时,它们比较小的堆花费的时间长得多。 因此,调整堆大小和垃圾回收策略以满足应用程序行为很重要。

5.应用拓扑

在前5个列表中要衡量的最终性能组件是您的应用程序拓扑。 由于云的出现,应用程序现在本质上可以具有弹性:您的应用程序环境可以增长和缩小以满足用户需求。 因此,对您的应用程序拓扑进行清单清点以确定确定环境的最佳大小非常重要。 如果您有太多的虚拟服务器实例,那么您的云托管成本将会增加,但是如果您没有足够的数量,那么您的业务交易将会受到影响。

在此评估过程中测量两个指标很重要:

  • 商业交易量
  • 容器性能

应该将业务交易作为基准,并且您应该在任何给定的时间知道满足基准所需的服务器数量。 如果您的业务事务负载意外增加,例如达到正常负载标准偏差的两倍以上,则您可能需要添加其他服务器以满足这些用户的需求。

另一个要衡量的指标是容器的性能。 具体来说,您想确定是否有任何服务器层处于胁迫状态,如果存在,则可能需要向该层添加其他服务器。 查看整个层中的服务器很重要,因为单个服务器可能由于垃圾收集等因素而处于胁迫状态,但是如果层中很大比例的服务器处于胁迫状态,则可能表明该层无法支持负载它正在接收。

由于您的应用程序组件可以单独扩展,因此分析每个应用程序组件的性能并相应地调整拓扑非常重要。

结论

本文介绍了在评估应用程序的运行状况时可能需要衡量的前五项指标。 总之,前五项是:

  • 商业交易
  • 外部依赖
  • 缓存策略
  • 垃圾收集
  • 应用拓扑

在下一篇文章中,我们将把本系列的所有主题放在一起,以介绍AppDynamics实施其APM战略所采用的方法。 这不是一篇营销文章,而是对为何做出某些决策和优化以及它们如何为您提供虚拟或基于云应用程序运行状况的强大视图的解释。

有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗? 立即开始免费试用 !

翻译自: https://www.javacodegeeks.com/2015/05/top-5-java-performance-metrics-to-capture-in-enterprise-applications.html

qt如何捕获应用程序输出

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

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

相关文章

C语言入门笔记,推荐收藏!

点击蓝字关注我们C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进…

php.c drcom,校园网绕过Drcom安装自动登录程序到路由器

简单记录一下,怎么在路由器上安装drcom脚本,实现自动登陆,一个路由器,全寝室都可以使用的方法。安装固件:我这里使用的是newifi mini型号的路由器下载后,插拔一次路由器,按下路由器上的reset按钮…

php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序

C 如何实现字典序排序法,自然排序类似PHP的natcasesort函数,整了一天没有头绪.数组是vector排序前:[0] > IMG0.png[1] > IMG3.png[2] > img1.png[3] > img10.png[4] > img12.png[5] > img2.png排序后:[0] > IMG0.png[1] > img1.png[2] > img2.png[3…

如何优雅地利用C++编程从1乘到20?

点击蓝字关注我们知乎的一个问题&#xff1a;答主&#xff1a;小白白。数学家版本&#xff1a;&#xff08;简单利索&#xff0c;深藏功与名&#xff09;#include <iostream> #include <cmath> int main() {std::cout << std::tgamma(20 1) << std::e…

用这个C语言骰子代码做选择

点击蓝字关注我们我相信很多人都遇到选择的事情&#xff0c;比较正常的就是&#xff0c;我拿了两个offer要如何选择。用下面这段C代码挺好的&#xff0c;你可以自己加上自己喜欢的判断。#include<stdio.h> #include<stdlib.h> #include<time.h>int main() {i…

java ee的小程序_Java EE应用程序的单片到微服务重构

java ee的小程序您是否曾经想过将现有的Java EE单体应用程序重构为基于微服务的应用程序需要做什么&#xff1f; 该博客说明了一个简单的购物车示例如何转换为基于微服务的应用程序&#xff0c;以及围绕它的一些担忧。 整体和基于微服务的应用程序的完整代码库位于&#xff1a…

C语言数据结构:什么是树?什么是二叉树?

点击蓝字关注我们前言在之前的数据结构学习中&#xff0c;我们学习了顺序表、链表、栈、队列这几种结构它们都是用链表或者数组的方式来实现的&#xff0c;主要考察我们对结构体的运用今天让我们来学习一个新的数据结构&#xff0c;也就是下面这副图里面的树啊不好意思&#xf…

如何把CPP源程序改写成C语言?

点击蓝字关注我们曾经参与过公司的bpp项目&#xff0c;就是bluetooth print profile。由于使用了hpijs的开源包&#xff0c;但是是C&#xff0b;&#xff0b;的。由于C&#xff0b;&#xff0b;解释器比C语言解释器占用的存储空间要大500k左右。为了节省有限的存储空间&#xf…

9 个很酷的 CMD 命令

点击蓝字关注我们ipconfig功能&#xff1a;查询本机IP地址操作方法&#xff1a;只要在在打开的cmd命令界面中输入“ipconfig”就可以了。msg功能&#xff1a;向对方电脑发送一条文本提示操作方法&#xff1a;首先你要知道对方的IP地址&#xff0c;接下来输入命令“msg /server:…

使用java进行婚礼庆祝_#102030:在30天内运行20 10K,庆祝Java 20年

使用java进行婚礼庆祝1995年5月23日是技术史上的重要时刻。 业界似乎并未意识到当天发布的语言会在未来几年内完全改变技术的格局。 Java将在今年的同一天庆祝20岁生日。 Java 20年&#xff0c;哇&#xff01; 回顾20年前的存储器时代&#xff0c;思考一下Java的发明时间/方式…

这几行 C++ 代码,真的骚!

点击蓝字关注我们事情是这么一回事&#xff1a;国外有个大佬在StackExchange上发起了一个叫做 Tweetable Mathematical Art 的比赛。参赛者需要用C编写代表三原色的RD、GR、BL三个函数&#xff0c;每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数&#x…

sts集成jboss_JBoss BPM Travel Agency演示与现代BPM数据集成

sts集成jboss不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍…

详解C语言的C#数组

点击蓝字关注我们数组是一种存储相同类型元素的固定大小顺序集合。数组用于存储数据集合&#xff0c;但一般会将数组视为存储在连续存储器位置的相同类型的变量的集合。如果要存储表示100名称学生的分数&#xff0c;需要独立地声明100整数变量。例如&#xff1a;number0.number…

oracle的连接函数,Oracle各种连接函数总结

1.前言Oracle可用连接函数会介绍以下几个Oracle列转行函数 Listagg()strcat()wmsys.wm_concat()2.Oracle列转行函数 Listagg()2.1最基础的用法&#xff1a;LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX)用法就像聚合函数一样&#xff0c;通过Group by语句&#xff0c;把每个Gr…

抽象工厂模式设计模式_21世纪的设计模式:抽象工厂模式

抽象工厂模式设计模式这是我的演讲的第二部分&#xff0c;“ 21世纪的设计模式” 。 此模式在Java代码中到处都有使用&#xff0c;尤其是在更多“企业”代码库中。 它涉及一个接口和一个实现。 该界面如下所示&#xff1a; public interface Bakery {Pastry bakePastry(Toppi…

对 C 语言指针最详尽的讲解

点击蓝字关注我们指针对于C来说太重要。然而&#xff0c;想要全面理解指针&#xff0c;除了要对C语言有熟练的掌握外&#xff0c;还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针&#xff1f;指针解决了一些编程…

app http routes.php,Laravel:我的应用程序没有被路由(Laravel : My app doesn't get routed)

Laravel&#xff1a;我的应用程序没有被路由(Laravel : My app doesnt get routed)我正在运行我的第一个laravel应用程序&#xff0c;在接下来的几个小时中遇到依赖项安装错误。对不起它可能是一个小错误&#xff0c;但似乎我无法找到。图片较暗&#xff0c;电脑坏了。应用程序…

为什么 Android 必须在主线程更新 UI ?

点击蓝字关注我们为什么Android必须在主线程更新UI&#xff1f;站在各位大牛的肩膀上&#xff0c;谢谢&#xff01;正常情况下&#xff0c;Android需要在UI线程更新UI&#xff0c;然鹅&#xff0c;在特殊情况下&#xff0c;子线程也能更新UI不在讨论之列&#xff0c;这篇文章主…

eclipse m2e配置_使用此首选项可加快Eclipse m2e配置

eclipse m2e配置谁不认识他们。 Eclipse中的旧式JFace对话框可以使您直观地看到实际上是一个相当简单的XML或属性文件。 对于m2e&#xff0c;它看起来像这样&#xff1a; 不幸的是&#xff0c;此屏幕的加载速度有点慢&#xff0c;除了检查版本号和其他您将永远不会更改的东西…

学点 STL C++ 的线性容器

点击蓝字关注我们std::array看到这个容器的时候肯定会出现这样的问题&#xff1a;为什么要引入 std::array 而不是直接使用 std::vector&#xff1f;已经有了传统数组&#xff0c;为什么要用 std::array?先回答第一个问题&#xff0c;与 std::vector 不同&#xff0c;std::arr…