java获取cpu使用率_2019年阿里P8架构师的解析:最新Java性能测试、调优策略

d562f3fe1af8414a32b0beada2c7cd8a.png

一、性能测试

Ⅰ.测试方法

  1. 微基准性能测试
  • 可以精准定位到某个模块或者某个方法的性能问题,例如对比一个方法使用同步实现和非同步实现的性能差异
  1. 宏基准性能测试
  • 宏基准性能测试是一个综合测试,需要考虑到测试环境、测试场景和测试目标
  • 测试环境:模拟线上的真实环境
  • 测试场景:在测试某个接口时,是否有其他业务的接口也在平行运行,进而造成干扰
  • 测试目标
  • 可以通过吞吐量和响应时间来衡量系统是否达标,如果不达标,就需要进行优化
  • 如果达标,就继续加大测试的并发数,探底接口的TPS
  • 除了关注接口的吞吐量和响应时间外,还需要关注CPU、内存和IO的使用率情况

Ⅱ.干扰因素

1.热身问题

①. 在Java编程语言和环境中,.java文件编译成.class文件后,需要通过解析器将字节码转换成本地机器码才能运行

②. 为了节约内存和执行效率,代码在最初被执行时,解析器会率先解析执行这段代码

③. 随着代码被执行的次数增加,当JVM发现某个方法或代码块运行得很频繁时,就会把这些代码认定为热点代码

  • 为了提高热点代码的执行效率,在运行时,JVM将通过即时编译器(JIT)把这些代码编译成与本地平台相关的机器码
  • 并进行各层次的优化,然后存储在内存中,之后每次运行代码时,直接从内存中获取

④. 因此在刚开始运行的阶段,JVM会花费很长的时间来全面优化代码,后面就能以最高性能运行了

2. 测试结果不稳定

①. 不稳定因素:机器其他进程的影响、网络波动、JVM GC的不确定性

①. 解决方案:通过多次测试,将测试结果求平均,只要能保证平均值在一个合理的范围之内,并且波动不大即可

3. 多JVM

①. 任意一个JVM都拥有整个系统的资源使用权

②. 如果一台机器上只部署单独的一个JVM,在做性能测试时,测试结果会很好,但一台机器上有多个JVM,则不一定

③. 尽量避免线程环境一台机器部署多个JVM

二、性能分析

1.完成性能测试之后,需要输出一份性能测试报告,测试结果需要包括

  • 测试接口的吞吐量和响应时间(平均、最大、最小)
  • 服务器的CPU、内存、磁盘IO、网络IO使用率、JVM的GC情况

2.通过观察性能指标,可以发现性能瓶颈,再通过自下而上的方式分析查找问题

  • 首先从操作系统层面,查看系统的CPU、内存、磁盘IO、网络IO的使用率是否存在异常
  • 再通过命令查找异常日志,通过分析日志,寻找导致性能瓶颈的原因
  • 还可以从Java应用的JVM层面下手,查看JVM的GC频率以及内存分配情况是否存在异常
  • 如果系统和JVM层面都没有出现异常情况,可以查看应用服务业务层是否存在性能瓶颈
  • 例如Java编程的问题、读写数据瓶颈

3.分析查找性能问题可以采用自下而上的方式,而解决性能问题,一般采用自上而下的方式逐级优化

三、性能调优

02728f8d55154e582b3b91fe5584fad6.png

思路业务调优 -> 编程调优 -> 系统调优

Ⅰ. 优化代码

1.应用层的问题代码往往会因为耗尽系统资源而暴露出来

2.例如某段代码导致内存溢出,这往往是将JVM的内存耗尽了

  • 这会引发JVM频繁地发生GC,导致CPU居高不下,此时也会耗尽系统的CPU资源

3.还有一些非问题代码导致的性能问题,比较难以发现

  • 例如如果对LinkedList进行for循环遍历,每次循环获取元素时,都会遍历一次list,读效率很低
  • 优化方案:可以采用Iterator

Ⅱ. 优化设计

1.面向对象有很多设计模式,可以用于优化业务层以及中间件层的代码设计,进而达到精简代码和提高整体性能的目的

2.例如单例模式在频繁创建对象的场景中,可以共享一个对象,减少频繁创建和销毁对象带来的性能开销

Ⅲ. 优化算法

1.合适的算法可以大大提升系统性能

2.例如在不同的场景中,使用合适的查找算法可以降低时间复杂度

Ⅳ. 时间换空间

1.如果系统对查询的速度没有很高的要求,但对存储空间要求苛刻,可以考虑用时间换空间

2.例如String的intern方法,可以将重复率比较高的数据存储在常量池,重复使用相同的对象,大大节省内存空间

  • 但由于常量池使用的是HashMap类型,如果存储数据过多,就会导致查询性能下降

Ⅴ. 空间换时间

1.使用存储空间来提升访问速度

2.例如MySQL的分库分表

Ⅵ. 参数调优

1.根据业务场景,合理地设置JVM的内存空间和GC算法

2.另外,合理地设置Web容器的线程池大小和Linux操作系统的内核参数

四、兜底策略

1.性能优化策略,主要为了提高系统性能,而兜底策略,主要为了确保系统的稳定性

2.限流

  • 对系统的入口设置最大访问限制,参考性能测试中探底的接口TPS
  • 同时采用熔断措施,友好地返回没有成功的请求

3.智能横向扩容

  • 当访问量超过某一个阈值时,系统可以根据需求自动横向扩容

4.提前扩容

  • 常用于高并发系统,例如瞬时抢购
  • 此时智能横向扩容无法满足大量发生在瞬间的请求

5.Kubernetes可以实现智能横向扩容和提前扩容Docker服务

五、总结

513170485357482b9a2f8bf91ada90d5.png

写在最后的鸡汤

加油努力吧!比你优秀的对手在学习,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰, 我们必须不断学习,否则我们将被学习者超越!

趁年轻,使劲拼,给未来的自己一个交代!

549aca094201feb725b88ae770abe920.png

更多资料

资料免费获取方式:转发,转发+关注后私信【架构】即可获取资料免费领取方式!

dca35d806546a6e24d60d2f73410f549.png

领取资料的朋友就有一些忘记私信而错过宝贵资料,所以关键别忘了转发后私信哦!

这些资料都以整理成了PDF文档,如果有需要获取到这个群里面的文档的话帮忙转发一下然后再关注我私信回复“架构”得到获取方式吧!即可进群获取下载!!!

504fa573d744931afb80d0957e8bd4e1.png

更多Java架构进阶资料展示

f2ffc8cf132d910b0d8f4d571c11e9e5.png
0b22b2fb30a1ef1f3511e38297b26aaa.png

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

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

相关文章

Linux下的实模式和保护模式

实模式:(即实地址访问模式)它是Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式。实模式被特殊定义为20位地址内存可访问空间上,这就意味着它的容量是2的20次幂&#xff08…

java在线编辑器_微软开源在线代码编辑器——Monaco Editor

介绍Monaco Editor是为VS Code提供支持的代码编辑器,运行在浏览器环境中。编辑器提供代码提示,智能建议等功能。供开发人员远程更方便的编写代码。移动浏览器或移动Web框架不支持Monaco编辑器。简单的理解就是VSCode中的代码编辑器和Monaco Editor使用的…

java的核心类库_Java核心类库,集合框架

Java集合框架的由来:Java最初版本只为最常用的数据结构提供了很少的一组类:比如Vector、Stack、Hashtable、BitSet、Enumerrationr接品,其中Enumerrationr接口提供了一种用于访问任意容器中各个元素的抽象机制。这是一种很明智的选择&#xf…

关于解决Permission is only granted to system apps

一句话,clean一下这个Project!就OK了…… 不要被假象迷惑!转载于:https://www.cnblogs.com/wytings/p/4156038.html

js splice方法_我用JS刷LeetCode | Day 8

如有兴趣,微信搜索「九零后重庆崽儿」,我们一起学前端。删除排序数组中的重复项:说明:现阶段的解题暂未考虑复杂度问题首发地址:我用JS刷LeetCode | Day 8​www.brandhuang.comQuestion:Given an array nums and a val…

java 删除目录下所有文件_Java删除文件、目录及目录下所有文件的方法实例

前言本文主要实现的功能是删除某个目录及目录下的所有子目录和文件,涉及到的知识点:File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除。具体代码示例如下:imp…

js 根据掩码位计算可用ip地址_变长子网掩码:轻松分配IP地址(下)

Hello,World.如约而至土土来更文咯[吐舌]图1首先先揭晓一下上一篇文章的答案那就是192.168.1.0/24与192.168.2.0/24不能ping通192.168.1.0/16与192.168.2.0/16能ping通图2还记得土土的提示吗?网络号相同则能够ping通那么根据/24可以看出这两个IP地址有24个网络号,即…

edittext实现自动查询,刷新listview

mEdittextqueryvalue.addTextChangedListener(new TextWatcher() {Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {/** 从本地数据库查询 */query s.toString(); //s是edittext编辑的内容isaddfalse;pageindex0;refreshView(type, que…

java rsaprivatekey_用ssh-keygen生成的公钥和私钥如何在java中转为RSAPublicKey和RSAPrivateKey...

公钥和私钥是用"ssh-keygen -t rsa"生成的,我把生成的公钥以字符串的形式传入下面的函数(从网上找的)就会报错。public static PublicKey string2PublicKey(String pubStr) throws Exception{ByteBuffer byteBuffer ByteBuffer.wrap(Base64.getDecoder().…

python字典中的值只能是字符串类型_python字典key不能是可以是啥类型

python中字典的key不能是可变类型。字典可存储任意类型对象,其中值可以取任何数据类型,但键必须是不可变的,如字符串、数字或元组。语法格式:【d {key1 : value1, key2 : value2}】。字典是另一种可变容器模型,且可存…

conda指定路径_导出不带前缀变量的conda环境,该变量显示executab的本地路径

为了在我的团队中提高可重复性,我在新创建的存储库中导出了一个conda环境文件,该存储库运行conda env export > environment.yml。在我的想法是让我的同事下载repo并运行conda env create -f environment.yml并准备好使用代码。在然而,我的…

未定义函数或变量_变量提升:JavaScript是顺序执行,为什么变量在定义之前执行不会报错而是报Underfined...

showName() console.log(myname) var myname hhh function showName() {console.log(函数showName被执行); }按照JavaScript 是按顺序执行的逻辑来理解的话,当执行到第 1 行的时候,由于函数 showName 还没有定义,所以执行应该会报错&#xf…

html背景图片大小控制

背景图尺寸(数值表示方式): #background-size{ background-size:200px 100px; } 背景图尺寸(百分比表示方式): #background-size{ background-size:30% 60%; } 背景图尺寸(等比扩展图片来填满元素,即cover值): #background-size{ …

java break递归_【Java】递归总结

摘要:大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问…

python3 urllib3文档_python urllib3

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

[翻译] RDVTabBarController

RDVTabBarController https://github.com/robbdimitrov/RDVTabBarController 效果: Supports iPad and iPhone 支持iPad与iPhoneSupports landscape and portrait orientations 支持横竖屏切换动画Can be used inside UINavigationController 可以用在UINavigationC…

C# 通过ImportNode AppendChild方法合并XmlDocument,XML转为DataTable

C# 通过ImportNode AppendChild方法合并XmlDocument,XML转为DataTable var doc1 new XmlDocument(); var doc2 new XmlDocument();XmlNode root1 doc1.DocumentElement;doc2.Load(new XmlNodeReader(myXmlNode2));foreach (XmlNode node in doc2.DocumentElement…

内存位置访问无效 midas.dll_java并发之内存模型

作者:killianxu来源:https://www.cnblogs.com/killianxu/p/11665903.htmljava内存模型知识导图一 并发问题及含义并发编程存在原子性、可见性、有序性问题。原子性即一系列操作要么都执行,要么都不执行。 可见性,一个线程对共享变量的修改&am…

java 字符串指定编码输出_java对字符的编码处理

在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。1. getBytes(charset)这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以…

python访问数据库如何解决高并发_使用 Python 和 Oracle 数据库实现高并发性

随着趋势发展的核心转向更多而不是更快发展,最大限度地提高并发性的重要性日益凸显。并发性使得编程模式发生了新的转变,可以编写异步代码,从而将多个任务分散到一组线程或进程中并行工作。如果您不是编程新手并且很熟悉 C 或 C,您…