一步步优化JVM六:优化吞吐量[转]

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

原文:http://ganlv.iteye.com/blog/1571315

参考:http://www.myexception.cn/software-architecture-design/1455594.html

现代JVM是一个具有灵活适应各种应用能力的软件,尽管很多应用能够在JVM的默认配置下运行良好,但是有些应用还是需要优化JVM配置以达到其性能要求。由于各种各样的应用能够运行在现在JVM上面,所以大量的JVM选项可以配置来提升应用的性能。不幸的是,对一个应用而言优化得很好的JVM配置,对应另外的应用不一定适合。所以,真正理解怎样优化JVM配置是非常有必要的。

   优化现代JVM是一门很大的艺术,但是理解和应用一些基本知识能够让优化JVM的任务变得更加简单。本章就是介绍这些基本知识和一些常规的步骤去优化Java HotSpot虚拟器。为了更好的理解本章的内容,你应该对JVM和垃圾回收器有一些基本的了解。

   本章以一步步的优化方法包括一些假设开始,在优化JVM之前,你需要先知道怎样测试应用性能、性能需求、测试的基础工具以及用来收集数据的垃圾回收器的命令行选项。接下来有几个章节来说明怎么样一步步优HotSpot虚拟器行为——启动、内存的占用、吞吐量、延迟等。

   方法

   下面这张图片展示了本章要说明的方法。他由一些清晰的应用性能需求开始,这个性能需求应该是应用负责人排过优先级的。与描述计算什么及输出什么的功能层面需求相比较,系统层面需求描述了系统的一些指标,比如:吞吐量、响应时间、内存消耗、启动时间、可用性以及易管理性等等。

    

 

     

   下一节,我们仔细看看每项系统指标对优化JVM的重要作用。

   优化JVM性能涉及很多权衡,当你提升某一项性能指标的时候,往往需要牺牲其他指标。比如说,为了最少的消耗内存,往往需要以延迟或者响应时间作为代价。或者,你想要提升应用的易管理性,你需要降低应用的的可用性的级别,由于可用性的提升是建立在多个JVM上的,多个JVM可用降低一个JVM出错造成整个应用的无法使用的风险。由于有很多的取舍需要做,理解真正性能需求就变得极其重要了,理解需求才能够正确的使用方法。

   一旦你知道了哪一些系统指标是重要的,接下来要做的就是选择JVM的部署模型,选择是部署在多JVM上面还是单个JVM上面。可用性、易管理性以及内存的占用等系统指标在选择合适的部署模型的时候都扮演了重要角色。

   接下来就是选择JVM的Runtime,HotSpot虚拟器提供了聚焦在更快的启动速度和更小的内存占用的32位的client虚拟器,以及在32位和64位系统中有更高的吞吐量server虚拟器。系统对吞吐量、响应时间以及启动时间的需求决定了对JVM Runtime的选择。

   接下来就是要优化垃圾回收器,以满足系统对内存占用、延迟以及吞吐量的需求,我们按照首先内存占用,其次延迟时间,最后吞吐量的顺序来进行优化。

   优化是在不停地测试和调整配置中循环的,需要数次循环以达到性能的需求,另外,也有可能优化了一个点的时候,但是需要回到前面几个步骤重新进行检查。比如,假如你在几次优化垃圾回收器之后,对应用的延迟还是不满意,这个时候就有必要调整JVM的部署模型。另外一种可能是,应用程序有修改或者需要重新设定应用程序的性能需求。

   对于一些应用以及它们的系统需求来说,需要循环几次这样的操作,直到应用责任人对应用的性能满意为止。

   假设

   这个一步步的优化步骤,是基于应用都有以下执行过程的假设:

   1、初始化阶段——初始化重要的数据结构和其他需要使用的依赖库。

   2、稳定阶段——应用消耗大部分的时间执行其核心函数。

   3、可选的总结阶段——比如需要制作报告。

   稳定阶段是我们需要主要关注的地方。

   测试基础设施:

   为了做出关于内存占用、延迟、吞吐量以及启动时间等优化有根据的决定,并且为了证实选择的JVM运行环境是正确的,我们需要从试验中收集数据(需要注意的是这个试验要能够反映生产环境的实际情况)。因此,有一个能够代表生产环境的性能测试环境就相当重要了。包括硬件和软件都需要代表生产环境。简单的说,测试环境和生产环境越接近,做出来的优化决定越靠谱。

   下面,我们详细介绍需求的定义。

   性能需求详细描述:   从前面我们知道,系统层面的需求决定应用的某一方面的特性,比如它的吞吐量、响应时间、消耗的内存、它的可用性以及易管理性等等。另外,功能需求决定了应用计算的内容或者产生的输出。

   接下来的我们描述一下我们会涉及到层面的需求。

   可用性

   可用性是衡量应用处于可用状态的指标。可用性需求表明了当应用的某些组件损坏或者遇到错误的时候,整个应用或应用的其他部分处于可用状态。

   在Java应用领域,高可用性可以通过把系统的分隔成各个组件,然后运行在不同JVM上面或者在多个JVM上面运行相同应用实例来实现。一个需要平衡的点是,当提升系统的可用性,系统的维护成本会升高。引入更多的JVM或者机器,那么就有更多的JVM需要管理,这个就是造成了成本的升高和复杂性的提升。

   我们常见的可用性需求例子:“当系统某一部分出现错误的时候,不要让整个应用程序崩溃”。

   易管理性

   易管理性是衡量系统的运行和监控的成本以及配置应用的成本。易管理性的需求表明了这个应用被管理的容易程度。通常来讲,用更少的JVM去运行应用,那么需要付出更小的成本去维护和监控应用。而且更少的JVM应用配置也更加简单,但是这个是建立牺牲应用的可用性上面的。

   一个简单的易管理性需求例子:“由于有限的资源,应用只能部署到尽量少的JVM上面。”

   吞吐量

   吞吐量是衡量系统在单位时间里面完成的工作数量。吞吐量需求通常忽略延迟或者响应时间。通常情况下,提升吞吐量需要以系统响应变慢和更多内存消耗作为代价。

   一个吞吐量的例子:“这个应用需要每秒完成2500个事务。”

   延迟和响应时间

   延迟或者响应时间是衡量应用从接收到一个任务到完成这个任务消耗的时间。一个延迟或者响应时间的需求需要忽略吞吐量。通常来讲,提升应用的响应时间需要以更低吞吐量或提高应用的内容消耗。

   一个延迟或者响应时间的例子:"这个应用会在60毫秒内,执行完成交易操作。"

   内存占用

   内存占用是衡量应用消耗的内存,这个内存占用是指应用在运行在某一个吞吐量、延迟以及可用性和易管理性指标下的内存消耗,内存占用是通常描述为应用运行的时候Java堆的大小或者总共需要消耗内存。通常情况下,通过增加Java堆的大小以增加应用内存占用可以提升吞吐量或者减少延迟,或者两者兼具。当应用可用的内存减少的时候,吞吐量和延迟通常会受到损失。在给定内存的情况下,应用占用的内存可以限制应用的实例数(这个会影响可用性)。

    一个例子说明内存占用的需求是:“这个应用会单独运行在一个8G的系统上面或者多出3个应用实例运行在一个24G的应用系统上面。”

   启动时间

   启动时间是衡量应用初始化的时间(如:eclipse的启动时间)。在Java应用中,大家可能对JVM优化应用的热点需要的时间感兴趣。Java应用初始化需要消耗的时间依赖于很多因素包括单不仅限于需要装载的类的数量、需要初始化的对象数量、并且这些对象怎么初始化,以及HotSpot虚拟器运行环境的选择(client or server,eclipse使用的HotSpot Client,Jboss会使用HotSpot Server,两者在初始化时间上和运行过程中对热点的优化不一样)。

   抛开需要加载的类的数量、需要初始化的对象的数量以及对象如何初始化,使用HotSpot client运行环境会获得更快的启动速度,由于他没有做足够的优化,这些优化可以提供更高吞吐量和更低的延迟。相反,HotSpot Server运行环境需要更长的启动时间,由于它需要更好多的获得应用关于Java代码的信息,并且对生成的机器码进行了很高优化。

   启动时间需求的例子如:“这个应用会再15秒内完成初始化。”

   

   对系统需求进行优先级排序

   优化操作的第一步就是对系统层面的需求进行优先级排序。做这个需要把主要的应用负责人叫到一起来商定优先级的排序,并且最终达成一致。这个讨论需要在应用的架构和设计阶段完成,由于这个讨论可以提供非常明确的结论,比如说:什么系统需求是最重要的。

   对于应用的负责人来说,系统需求的优先级决定了优化操作。最重要的系统需求促使形成一些基本决定。比如说:可用性比易管理性重要,那么JVM部署模型就会采用部署多个JVM。相反如果易管理性比可用性重要,那么就更加倾向于选择单个JVM的部署模型。

   如何选择JVM部署模型和JVM Runtime会在接下来的一节中讲到。

转载于:https://my.oschina.net/newchaos/blog/3030457

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

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

相关文章

element-ui 网格_UI备忘单:列表与网格

element-ui 网格重点 (Top highlight)Grids or lists? That is the question we will look at in this cheat sheet. While they can be used anywhere in your site, we are going to look primarily at search results, catalogs and newsfeeds. Making this choice will de…

50行 koa-compose,面试常考的中间件原理原来这么简单?

大家好,我是若川。源码共读《1个月,200人,一起读了4周源码》 活动第五期是学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理中的koa-compose源码原理,阅读不到50行的koa-compose源码。这篇是izjing小哥哥的投稿。…

sqlite3源码编译到Android,实现SQLite跨全平台使用

文/何晓杰Dev(高级Android架构师)著作权归作者所有,转载请联系作者获得授权。初看这个标题你可能会不解,SQLite 本身就是一个跨平台的数据库,在这里再说跨平台有什么意义呢?其实不然,目前我就遇到了一个项目…

illustrator下载_平面设计:16个Illustrator快捷方式可加快工作流程

illustrator下载I know, I know — keyboard shortcuts sound so nerdy, and you’re a graphic designer, not an IT Director, why should you learn keyboard shortcuts?我知道,我知道—键盘快捷键听起来很书呆,而且您是图形设计师,而不是…

手把手教你五分钟扒个源码写个无敌外挂

大家好,我是若川。源码共读《1个月,200人,一起读了4周源码》 活动进行到第五期了,欢迎点链接加我微信 ruochuan12 报名参加。前言前段时间群里分享了一个小游戏,多次怀疑自己的眼睛以后,尝试去写个外挂。中…

Kubernetes 1.14重磅来袭,多项关键特性生产可用

走过了突飞猛进的2018年,Kubernetes在2019年终于迎来了第一个大动作:Kubernetes 1.14版本的正式发布!Kubernetes 本次发布的 1.14 版本,包含了 31 项增强,其中 10 项为 GA,12 项进入 beta 试用阶段&#xf…

open ai gpt_让我们来谈谈将GPT-3 AI推文震撼到核心的那条推文

open ai gpt重点 (Top highlight)“设计师”插件 (The ‘Designer’ plugin) A couple days ago, a tweet shared by Jordan Singer turned the heads of thousands of designers. With the capabilities of GPT-3 (from OpenAI), he shared a sample of what he was able to c…

我历时3年才写了10余篇源码文章,但收获了100w+阅读

你好,我是若川。最近来了一些读者朋友,在这里简单介绍自己的经历,也许对你有些启发。之前发过这篇文章,现在修改下声明原创,方便保护版权。最近组织了源码共读活动1个月,200人,一起读了4周源码&…

第 8 章 容器网络 - 061 - flannel 的连通与隔离

flannel 的连通与隔离 测试 bbox1 和 bbxo2 的连通性: bbox1 能够 ping 到位于不同 subnet 的 bbox2,通过 traceroute 分析一下 bbox1 到 bbox2 的路径。 1) bbox1 与 bbox2 不是一个 subnet,数据包发送给默认网关 10.2.9.1&#…

计算机视觉笔记本推荐_视觉灵感:Mishti笔记本

计算机视觉笔记本推荐The Mishti Notebook is a project close to my heart, wherein I experimented with screen printing techniques at the Print Labs at the National Institute of Design, Ahmedabad. Dating back to the year 2012 when the NID Print Labs was first …

Google工程师:如何看待程序员普遍缺乏数据结构和算法知识?

出处:极客时间《数据结构与算法之美》很多技术人都很迷茫,觉得自己做的项目没有技术含量,成天就是卖苦力。技术的东西,日新月异,有些人总在忙于追求热点新技术,东学学、西学学,平时泛泛地看技术…

android guide 中文版,Sky Guide

Sky Guide是一款能让小伙伴们观察银河的手机软件,尤其是喜欢行星、星座的小伙伴们来讲,这款软件能很好的帮助小伙伴们观看这些,让小伙伴们体验不一样的观星乐趣,因此想要观看的小伙伴们,赶紧来试试吧。软件介绍&#x…

layui选项卡嵌套选项卡_在ProtoPie中使用嵌套组件构建选项卡栏

layui选项卡嵌套选项卡One of the powerful features of ProtoPie is the ability to build fully portable and interactive UI components. We are going to make use of nested components, SVG icons, and layout constraints to build a tab bar UI component that is sel…

50行代码串行Promise,koa洋葱模型原来这么有趣?

1. 前言大家好,我是若川,最近组织了源码共读活动《1个月,200人,一起读了4周源码》,感兴趣的可以加我微信 ruochuan12 参与,长期交流学习。之前写的《学习源码整体架构系列》 包含jQuery、underscore、lodas…

js 用迭代器模式优雅的处理递归问题

2019独角兽企业重金招聘Python工程师标准>>> 什么是迭代器 循环数组或对象内每一项值,在 js 里原生已经提供了一个迭代器。 var arr [1, 2, 3] arr.forEach(function (item) {console.log(item) })实现一个迭代器 var iterator function (arr, cb) {fo…

如何抓取html请求,请求获取网页的response,获取网页的html 怎么那么慢

HttpEntity multipart builder.build();httppost.setEntity(multipart);long start System.currentTimeMillis();// 发送请求response httpclient.execute(httppost);long end System.currentTimeMillis();System.out.println("查询upsfreight消耗的时间是(毫秒):&quo…

Serverless 究竟是什么?

大家好,我是若川。说起 Serverless,我想你应该并不陌生,作为一种云开发的架构模式,在近两年里,伴随着云原生概念的推广愈发火爆。作为一名 Serverless 的拥趸,在跟大家推荐的过程中,我经常能看到…

instagram.apk_评论:Instagram Reels vs.TikTok

instagram.apkWith all the attention to the newly debuted Instagram Reels from Facebook and the hilarious, bizarre world of TikTok, here’s a first impression on the two platforms and how they compare from a designer’s perspective.所有人都在关注Facebook新近…

240多个jQuery常用到的插件

概述 jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及的,它兼容 CSS3,还兼容各种浏览器(IE 6.0, FF 1.5, Safari 2.…

华为首款鸿蒙设备正式入网,华为首款鸿蒙设备正式入网:麒麟9000+挖孔全面屏,价格感人!...

作为国内电子产品领域的巨头之一,华为这两年的快速发展是大众有目共睹的,除了手机业务外,华为的平板业务同样有亮眼表现,无独有偶,在近期各方媒体的不断披露之下,又有一款华为平板被基本确认,这…