如果你只打算测量应用的一个方面,本文会推荐你测量商业事务的表现。尽管容量指标(container metrics)能帮助你决定何时调节集群规模,但是商业事务才决定了应用本身的性能。你无需询问应用服务器线程池(thread pool)的使用情况,而是关心用户能否迅速完成他们的商业事务,以及这些事务的表现是否正常。

介绍一点背景知识:商业事务通过其入口进行辨别,即用户与你的业务进行互动的入口。这类互动包括:一个网页请求,一个网页服务调用,或消息队列中的一条消息。当然,你也可以基于一个URL参数为同样的网页请求定义多个入口,或基于一个服务调用的内容定义多个入口点。关键在于:商业交易必须与对你的业务流程相关联,比如说中国移动的空中缴费业务对应到系统中是多个原子服务,我们就应该将这几个原子服务通过相应的关联聚合成一个空中缴费业务来进行监控。

辨别某个商业交易后,它的性能就会在整个应用生态系统中进行测量。每个商业交易的性能会与其基准进行比较,判定其是否正常。譬如,如果某个商业事务的响应时间大于您设定的阈值,我们便判定其运行异常。

总而言之,商业事务最能反映用户体验,因此它们也是最重要的抓取维度。

2.外部服务

外部服务的形式多种多样:从属的网页服务、遗留系统或数据库等。外部服务是与应用交互的系统。运行在外部服务系统中的代码常常无法控制,但是我们可以控制这些系统的配置,因此了解他们是否运行正常以及何时出错也很重要。并且,我们必须有能力区分问题是出自自身应用,还是源于这些外部服务系统。

从商业事务的角度来说,我们可以辨别并测量这些处于自身应用的外部服务。有时,我们需要配置监控方法从而辨别那些包裹了外部服务调用的方法。但是对于常见的协议,诸如HTTP和JDBC,外部服务可以自动检测。

商业事务让你对应用的性能有了全局的掌控,帮助你对性能问题进行分类。但是外部服务总能以意想不到的方式极大地影响应用的运行,所以你必须监控它们。

3.垃圾回收

从Java发布最早版本开始,一直都保留的核心特性就是垃圾回收,它真是让人又爱又恨。垃圾回收使我们不再需要手动管理内存:当使用完一个对象后,我们只需删除它的引用,然后垃圾回收就会自动释放它。如果你使用过需要手动管理内存的语言,诸如C或C++,你会满怀感激。垃圾回收为程序员们减少了分配、释放内存空间的繁琐步骤。

此外,因为垃圾回收器会自动释放没有引用的内存空间,它减少了传统的内容泄露情况,即内存被分配后,该内存的引用在内存释放前就被删除了。听起来就像灵丹妙药,不是么?

尽管垃圾回收达成了无需手动管理内存的目标,也防止了传统的内存泄露,但是作为代价,垃圾回收过程有时相当笨拙。根据不同的JVM,垃圾回收策略也会不同。深入探讨这些策略超出了本文的主旨。但是,读者应该明白,了解垃圾回收期的工作原理,以及最佳的配置方案至关重要。

垃圾回收最大的敌人就是传说中的主要(major)或(full)垃圾回收。除了Azul JVM,所有的JVM都有这个问题。通常,垃圾回收大致分为两类:

次级

主要

为了释放存活时间较短的对象,次级垃圾回收发生得相对频繁。他们在运行时不会封锁线程,产生的影响较小。

然而,主要垃圾回收,有时也称为“暂停世界(Stop The World, STW)”垃圾回收,因为他们在运行时会封锁JVM中的所有线程。

当垃圾回收运行时,它会运行一项可达性测试(reachability test),如图四所示。它会创建一个由对象组成的根集合(root set),该集合包含每个运行线程中的直接可见对象。接着,它会探寻根集合中的对象涉及的其他对象,然后探寻这些对象涉及的对象,直到所有对象都被涉及。在这个过程中,它会记录(mark)下现时活动对象的内存地址,然后把不被使用的所有地址都扫除(sweep)。说得更恰当些,它会把没有根集合对象引用的内存都释放。最终,它会压缩、整理这些内存,这样新的对象才能获得内存分配。

根据不同的JVM,次级、主要回收的方式都会不同。图五图六展示了在Sun JVM内次级、主要回收的操作方式。

在次级回收中,内存主要分配到Eden空间直到将其填满。接着,拷贝收集器(copy collector)会将Eden中的活动对象拷贝到两个幸存者空间(survivor spaces, to space和from space)。遗留在Eden中的对象就会被移除。如果幸存者空间被填满,但还有多余的活动对象,这些对象会被移到tenured空间。只有主要回收才能释放tenured空间的内存。

最终,tenured空间会被填满,主要回收将会执行。它不会将幸存者空间放不下的活动对象拷贝到tenured空间中。此时,JVM会封锁所有线程,运行可达性测试,清除年轻的数据(Eden和两个幸存者空间),并压缩tenured空间。我们将之称为主要回收。

你或许会想,堆越大,主要回收运行得越不频繁。但是当它执行时,所需时间就会比小堆要长。因此,调整好堆的大小和垃圾回收策略对于应用的性能也很重要。

4.应用布局

最后要探讨的性能指标是应用布局。因为云的出现,现在的应用变得更加灵活:应用环境可以根据用户需求调节大小。因此,对应用的布局进行检测从而决定实例的多少是否合适是非常重要的。如果你的实例太多,你的云主机成本就会增加。但如果你没有足够的实例,商业事务就会受到影响。

在评测过程中,下面两个指标尤其重要:

商业事务的吞吐量

容器性能

商业事务应该基准化,你应该知道在给定的时间里为了满足基准所需的实例数量。如果你的商业事务的吞吐量增长突然,你就要增加实例以满足用户。

另一个需要监测的是容器性能。具体来说,你想确定是否有应用中的实例负载过大,如果有,你或许想在那个应用中添加实例。从应用的角度查看实例状态很重要,因为单个实例可能由于垃圾回收之类的因素负载过大,但如果应用中大多数实例都负载过大,则该应用可能已经无法支持它接受的访问量。

因为应用中的实例可以单个地调节规模,所以分析各个实例的性能进而调整应用布局就至关重要。

来源:码农网

程序员共读整理发布,转载请联系作者获得授权

【点击成为码农大神】

java最好性能手机_企业级Java应用最重要的4个性能指标相关推荐

  1. java锁性能对比_提高Java的锁性能

    java锁性能对比 Plumbr是唯一可以通过解释应用程序性能数据来自动检测Java性能问题根本原因的解决方案. 几个月前,我们在Plumbr中引入了锁定线程检测之后,我们开始收到类似于"嘿 ...

  2. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  3. jpa oracle 传参int类型判空_企业级Java开发之图解JPA核心构件

    编者按: 企业级的软件开发中,Java一直都是中流砥柱.在Java EE8之后,Oracle公司把企业级Java标准控制权转交Eclipse基金.最新或·和以后的企业级Java将冠名为Jakarta ...

  4. java反射的优化_请问Java反射的性能为什么比直接调用慢一个数量级左右?

    Method.invoke()本身要用数组包装参数:而且每次调用都必须检查方法的可见性(在Method.invoke()里),也必须检查每个实际参数与形式参数的类型匹配性(在NativeMethodA ...

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

    java常见性能优化 Java性能是所有Java应用程序开发人员都关心的问题,因为快速使应用程序与使其正常运行同等重要. 史蒂文·海恩斯(Steven Haines)使用他在Java性能问题上的个人经 ...

  6. java 注解应用技巧_改善Java应用程序性能的快速技巧

    java 注解应用技巧 曾经遇到过性能问题吗? 我也是. 如果我的经理再喊一次" faaaaster",我一生都会有听力障碍. 顺便说一句,我能听到所有噪音中的德语发音吗? ;-) ...

  7. 最好用的Java手机_爪哇(JAVA)手机游戏谁最好玩?

    手机尽出,款款都有照相机已经不吸引人,要有自己喜欢的内建功能才是上上之选.针对爱打电动的游戏一族,小编选出几款近期新推出.内建JAVA游戏的手机,并以生动而详尽的文字介绍让你全盘了解 JAVA 游戏的 ...

  8. java instanceof性能差_在J中使用instanceof的性能影响

    在J中使用instanceof的性能影响 我正在开发一个应用程序,一种设计方法涉及到instanceof运算符的极大使用. 虽然我知道OO设计通常会试图避免使用instanceof,但这是一个不同的故 ...

  9. java是什么格式_是java格式

    错误:编码GBK的不可映射字符的解决办法 最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后 ...

最新文章

  1. js数组的sort排序详解
  2. php sockent通信
  3. 条款14:在资源管理类中心copying行为(Think carefully about copying behavior in resource-manage classes)...
  4. element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能...
  5. deeplearning4j
  6. easyui validatebox 验证类型
  7. java esc_java – Swing:当按下ESC键时如何关闭对话框?
  8. Ubuntu10.04下Linux内核编译的完整步骤
  9. #pragma comment使用
  10. 打开量化交易的黑箱——note1
  11. 抢票软件开发(二) 模拟登录
  12. 【loj2339】【WC2018】通道
  13. 怎样设置公众号自动回复
  14. 数据库防火墙应具备哪些能力
  15. nginx学习笔记七(nginx HTTP框架的执行流程)
  16. HTML5开发 页游/手游动画及游戏系列教程(Game Tutorial):(一)物体动起来吧
  17. 应用代码解决小学鸡兔同笼问题。(已知鸡和兔的总数量为n,总脚数为m。输入n和m,依次输出鸡和兔的数目。如果无解,则输出“no answer”。)
  18. 灵性图书馆:好书推荐-《太傻天书》
  19. Python爬虫-爬取常用IP代理
  20. 复旦计算机学硕上岸,复旦大学工程与应用技术研究院电子信息2020年考研上岸前辈经验指导...

热门文章

  1. 关于Oracle的提示详解(1)
  2. 互联网移动在“云”端
  3. C#正则表达式判断字符串中是否有数…
  4. 小程序已成BAT争锋新战场
  5. Python Cookbook(第3版)中文版:15.18 传递已打开的文件给C扩展
  6. SQLite学习和使用
  7. Git 入门 ---- Git 与 SVN 区别
  8. 使用 Apache Pig 处理数据7
  9. shell里执行执行mysql 语句
  10. 在线HTML5,CSS3,VueJS,jQuery运行测试练习工具