当前位置: 首页 > news >正文

Java性能权威指南-总结4

Java性能权威指南-总结4

  • Java性能调优工具箱
    • 操作系统的工具和分析
      • CPU运行队列
      • 磁盘使用率
      • 网络使用率
    • Java监控工具
      • 基本的VM信息

Java性能调优工具箱

操作系统的工具和分析

CPU运行队列

快速小结

  1. 检查应用性能时,首先应该审查CPU时间。
  2. 优化代码的目的是提升而不是降低(更短时间段内的)CPU使用率。
  3. 在试图深入优化应用前,应该先弄清楚为何CPU使用率低。

磁盘使用率

监控磁盘使用率有两个目的。第一个目的与应用本身有关:如果应用正在做大量的磁盘I/O操作,那I/O就很容易成为瓶颈。

想了解何时磁盘I/O是瓶颈非常困难,因为这取决于应用的行为。如果应用往磁盘写数据时没有有效的缓冲,磁盘I/O的统计数据就会非常低。但是,如果应用执行的I/O超过了磁盘的承载,磁盘I/O的统计数据就会非常高。这两种情形的性能都需要提升。
有些系统的基本I/O监控要好于其他系统。这是Linux系统iostat的部分输出:
在这里插入图片描述
应用正在往磁盘sda写数据。乍一看,磁盘统计数据还不错。w_await——每次I/O写的时间——相当低(6.08毫秒),磁盘使用率只有1.04%。(可接受的值取决于物理磁盘,在低于15毫秒时。)但这里有条线索可以看出点问题:系统在内核花费了37.89%的时间。一种可能是系统正在进行其他I/O(在其他程序中)。如果这个系统时间都来自被测的应用,说明某些低效率的事正在发生。

另一条线索是,系统每秒写为24.2:当每秒写入只有0.14MB时,这算很大的数字。这说明I/O已经是瓶颈,接下来应该检查应用是如何写的。

如果磁盘速度赶不上I/O请求,问题的另外一面就出现了:
在这里插入图片描述
Linux好处在于可以立即告诉我们磁盘的使用率为100%。它也能告诉我们进程的47.89%的事件在iowait(表示正在等待磁盘)。

监控磁盘使用率的第二个理由是——即便预计应用不会有很高的I/O——有助于监控系统是否在进行内存交换。计算机的物理内存量是固定的,但它们可以用大得多的虚拟内存来运行一系列应用。应用会保留更多超过它们实际所需的内存量,并且它们通常也只使用分配给它们的内存的一部分。这两种情况下,操作系统可以将不用的内存保留在磁盘上,在需要时换页到物理内存。

大多数情况下,这种类型的内存管理可以工作得很好,特别是交互式应用和GUI程序。这种管理方式对服务器类应用来说效果稍差,因为这些应用需要更多内存。由于Java堆的原因,这种管理方式对于任何Java程序来说都比较糟糕。

正在内存交换的系统——从主内存移动数据到磁盘或者反过来——一般来说,性能比较差。还有其他系统工具可以报告系统交换,例如vmstat输出中有两列(si是换进,so是换出)可以警告我们系统是否正在交换。磁盘活动说明内存交换可能正在发生。
快速小结

  1. 对于所有应用来说,监控磁盘使用率非常重要。即便不直接写磁盘的应用,系统交换仍然会影响它们的性能。
  2. 写入磁盘的应用遇到瓶颈,是因为写入数据的效率不高(吞吐量太低),或者是因为写入太多数据(吞吐量太高)。

网络使用率

如果应用运行时需要网络——比如Java EE应用服务器——也必须监控网络流量。网络使用率类似磁盘流量:应用可能没有充分利用网络所以带宽很低,或者写入某网络接口的总数据量超过了它所能处理的量。

由于标准的系统工具通常只能显示某个网络接口发送和接收的数据报数和字节数,所以它们在监控网络流量方面差强人意。虽然这些信息有用,但无法告诉我们网络是没有充分利用,还是过度使用。Unix系统监控网络的基本工具是netstat它可以显示每个网络接口的流量概要,包括网络接口的使用度:
在这里插入图片描述
示例中的e1000g1是1000 MB接口,使用率非常低(0.33%)。这个工具(以及其他类似的工具)可以用来计算接口的使用率。在上述输出中,接口的数据写入速率是225.7 Kbps,读取速率是176.2 Kbps。对于1000MB的网络,相除以后可以得到使用率0.33%,nicstat也能自动算出接口的带宽。

typeperf或netstat这样的工具可以报告读取和写入的数据,但是要计算网络使用率,必须自己用脚本计算接口的带宽。一般工具报告的单位是字节/秒(Bps),但带宽的单位是位/秒(bps)。1000兆位网络每秒处理125兆字节(MB)。本示例中,读为0.22 MBps,写为0.16 MBps,相加然后除以125得出使用率为0.33%。nicstat更便于使用。

网络无法支持100%的使用率。 对本地以太局域网来说,承受的网络使用率超过40%就意味着接口饱和了。如果网络是包交换或使用不同的传输介质,网络使用率的最大值就可能会不同,因此最好是评估网络架构之后再确定合适的值。这个值与Java无关,只是简单利用网络参数和操作系统接口。

快速小结

  1. 对基于网络的应用来说,务必要监控网络以确保它不是瓶颈。
  2. 往网络写数据的应用遇到瓶颈,可能是因为写数据的效率太低(吞吐量太低),也可能是因为写入了太多的数据(吞吐量太高)。
    

Java监控工具

要想深入了解JVM自身,需要使用Java的监控工具。JDK自带以下所列工具:

  • jcnd

用来打印Java进程所涉及的基本类、线程和VM信息。它适用于脚本,可以像这样执行:

%jcmd process_id conmand optional_arguments

jcmd help可以列出所有的命令。jcmd help <command>可以给出特定命令的语法。

  • ·jconsole

提供JVM活动的图形化视图,包括线程的使用、类的使用和GC活动。

  • ·jhat

读取内存堆转储,并有助于分析。这是事后使用的工具。

  • jmap

提供堆转储和其他JVM内存使用的信息。可以适用于脚本,但堆转储必须在事后分析工具中使用。

  • jinfo

查看JVM的系统属性,可以动态设置一些系统属性。可适用于脚本。

  • jstack

转储Java进程的栈信息。可适用于脚本。

  • jstat

提供GC和类装载活动的信息。可适用于脚本。

  • jvisualvm

监视JVM的GUI工具,可用来剖析运行的应用,分析JVM堆转储(事后活动,jvisualvm也可以实时抓取程序的堆转储)。

这些工具可广泛用于以下领域:

  • 基本的VM信息
  • 线程信息
  • 类信息
  • 实时GC分析
  • 堆转储的事后处理
  • JVM的性能分析

工具和适用领域并非一一对应的,许多工具可用于多个领域。所以不是单个研究每个工具,而是着眼于Java重要的可观测领域,讨论这些工具如何提供这类信息。同时,我们还会讨论其他工具(有些是开源,有些是商业),虽然提供的基本功能相同,但是相比基本的JDK工具具有一定的优势。

基本的VM信息

JVM工具可以提供JVM进程的基本运行信息:它运行多久了,使用哪些JVM标志,以及JVM的系统属性,等等。
运行时间
此命令可以查看JVM运行的时长:

% jcmd process_id VM.uptime

系统属性
以下命令可以显示System.getProperties()的各个条目。

% jcmd process_id VM.systen_properties

或者

% jinfo -sysprops process_id

这包括通过命令行-D标志设置的所有属性,应用动态添加的所有属性和JVM的默认属性。

JVM版本
用以下方式获取JVM版本:

% jcmd process_id VM.version

JVM命令行
jconsole的“VM摘要”页可以显示程序所用的命令行,或者用jcmd显示:% jcmd process_id VM.command_line

JVM调优标志
可用以下方式获得对应用生效的JVM调优标志:

% jcmd process_id VM.flags [-all]

调优标志
JVM可以设置许多调优标志,上面最后两个jcmd示例对于获取这类信息很有用。command_line显示直接在命令行指定的标志。flags显示命令行设置的标志,以及JVM直接设置的标志(因为它们的值是通过自动优化决定的)。该命令加上all时,可以列出JVM内部所有的标志。

诊断性能问题时,找出哪些标志起作用是很常见的事。JVM运行时,可以用jcmd做到这一点。如果想找出特定JVM的平台特定的默认值是什么,那么在命令行上添加-XX:+Printflagsfinal会很有用。
想知道特定平台所设置的标志是什么,可以执行以下命令:
% java other_options -XX:+PrintFlagsFinal -version
……几百行输出,包括……

uintx InitialHeapSize : = 4169431040  {product}
intx InlineSmallCode   = 2000                {pd product}

应该在命令行包括所有标志,因为有些标志会影响其他标志,特别是GC相关的标志。这个命令会打印JVM标志及其取值的完整列表(结果和jcnd结合VM.flags -all打印的相同)。这些命令的标志数据以上述两种方式之一显示。输出第1行中的冒号表示标志使用的是非默认值。发生这种情况,可能是以下原因导致。

  • 标志值直接在命令行指定。
  • 其他标志间接改变了该标志的值。
  • JVM自动优化计算出来的默认值。

第2行(没有冒号)表示,值是这个JVM版本的默认值。某些标志的默认值在不同平台上可能会不相同,输出的最右列会指示。product表示在所有平台上的默认设置都是一致的。pd product表示标志的默认值是独立于平台的。

另一种查看运行中的应用的此类信息的工具,叫作jinfo。jinfo的好处在于,它允许程序在执行时更改某个标志的值。
以下是如何获取进程中所有标志的值:
% jinfo -flags process_id

jinfo带有-flags时可以提供所有标志的信息,否则只打印命令行所指定的标志。这两种
数据都不像-XX:+Printflagsfinal那样易读,但jinfo有其他值得注意的特性。

jinfo可以检查单个标志的值:

% jinfo -flag PrintGCDetails process_id
-XX:+PrintGCDetails

虽然jinfo本身不会显示是否manageable,但manageable(如Printflagsfinal输出中所标识的)的标志可以通过jinfo开启或关闭:

% jinfo -flag -PrintGCDetails process_id # turns off PrintGCDetails
% jinfo -flag PrintGCDetails process_id
-XX:-PrintGCDetails

需要当心的是,jinfo可以更改任意标志的值,但并不意味着JVM会响应更改。比如说,大多数影响GC算法行为的标志都在启动时使用,以决定垃圾收集器的行为方式。之后通过jinfo更改标志值,并不会导致JVM改变它的行为。它会以初始时的算法继续执行。所以这个技术只会对那些在Printflagsfinal输出中标记为manageable的标志有效。

快速小结

  1. jcmd可用来查找运行中的应用所在JVM的基本信息——包括所有调优标志的值。
  2. 2.命令行上添加-XX:+Printflagsfinal可输出标志的默认值。这在查看特定平台自动优化所判定的默认值时很有用。
    3.info在检查(某些情况下可以更改)单个标志时很有用。

相关文章:

Java性能权威指南-总结4

Java性能权威指南-总结4 Java性能调优工具箱操作系统的工具和分析CPU运行队列磁盘使用率网络使用率 Java监控工具基本的VM信息 Java性能调优工具箱 操作系统的工具和分析 CPU运行队列 快速小结 检查应用性能时&#xff0c;首先应该审查CPU时间。优化代码的目的是提升而不是…...

c语言全局变量和局部变量问题汇总

✅作者简介&#xff1a;嵌入式领域优质创作者&#xff0c;博客专家 ✨个人主页&#xff1a;咸鱼弟 &#x1f525;系列专栏&#xff1a;单片机设计专栏 &#x1f4c3;推荐一款求职面试、刷题神器&#x1f449;注册免费刷题 1、关键字static的作用是什么&#xff1f; 定义静态变…...

14.3:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

给定一个由字符串组成的数组strs&#xff0c;必须把所有的字符串拼接起来&#xff0c;返回所有可能的拼接结果中字典序最小的结果 贪心写法 首先注意的一点是&#xff1a;如果两个字符串的长度相同&#xff0c;“abc”&#xff0c;“abd”&#xff0c;肯定是“abc”的字典序最…...

C++ 项目实战:跨平台的文件与视频压缩解压工具的设计与实现

C实战&#xff1a;跨平台文件与视频压缩解压工具的设计与实现 一、引言&#xff08;Introduction&#xff09;1.1 项目背景与目标1.2 技术选型&#xff1a;C、FFmpeg、libarchive、libzip、QtCFFmpeglibarchivelibzipQt 二、设计思路与框架&#xff08;Design Philosophy and F…...

C和指针(二)数据

数据类型 1&#xff0c;C语言中仅有四种基本数据类型——整型、浮点型、指针、聚合类型&#xff08;数组、结构等&#xff09;。 2&#xff0c;整型包括字符、短整型、整型、长整型&#xff0c;且可以分为有符号和无符号两种版本。 1&#xff09;长整型至少和整型一样长&#…...

PyTorch基础学习(一)

一.简介 PyTorch是一个基于Python的开源机器学习框架&#xff0c;它提供了丰富的工具和接口&#xff0c;用于构建和训练深度学习模型。PyTorch的主要特点包括&#xff1a; 动态计算图&#xff1a; PyTorch使用动态计算图&#xff0c;这意味着在模型构建过程中可以实时地进行计…...

chatgpt赋能python:Python代做:让您的网站更友好的SEO利器

Python代做&#xff1a;让您的网站更友好的SEO利器 如果您是一位网站管理员或者SEO工程师&#xff0c;您一定知道SEO对于网站的重要性。那么在SEO中&#xff0c;Python代做可以为您提供什么&#xff1f;在本文中&#xff0c;我们将通过介绍Python代做的技术和方法&#xff0c;…...

2022年都快结束了,还有人不会安卓录屏?在安卓上录制屏幕的的实现方式

前言 在我之前的文章 《以不同的形式在安卓中创建GIF动图》 中&#xff0c;我挖了一个坑&#xff0c;可以通过录制屏幕后转为 GIF 的方式来创建 GIF。只是当时我只是提了这么一个思路&#xff0c;并没有给出录屏的方式&#xff0c;所以本文的内容就是教大家如何通过调用系统 A…...

px rem em rpx 区别 用法

任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em16px。那么12px0.75em,10px0.625em。为了简化font-size的换算&#xff0c;需要在css中的body选择器中声明Font-size62.5%&#xff0c;这就使em值变为 16px*62.5%10px, 这样12px1.2em, 10px1em, 也就是说只需要…...

忆享聚焦|ChatGPT、AI、网络数字、游戏……近期热点资讯一览

“忆享聚焦”栏目第十四期来啦&#xff01;本栏目汇集近期互联网最新资讯&#xff0c;聚焦前沿科技&#xff0c;关注行业发展动态&#xff0c;筛选高质量讯息&#xff0c;拓宽用户视野&#xff0c;让您以最低的时间成本获取最有价值的行业资讯。 目录 行业资讯 1.科技部部长王志…...

[Daimayuan] 树(C++,动态规划,01背包方案数)

有一棵 n n n 个节点的以 1 1 1 号点为根的有根树。现在可以对这棵树进行若干次操作&#xff0c;每一次操作可以选择树上的一个点然后删掉连接这个点和它的儿子的所有边。 现在我们想知道对于每一个 k k k ( 1 ≤ k ≤ n 1≤k≤n 1≤k≤n)&#xff0c;最少需要多少次操作能…...

如何选择源代码加密软件

&#xff08;SDC沙盒&#xff09;和DLP、文档加密、云桌面等&#xff0c;其优缺点做客观比较如下&#xff1a; 比较内容安全容器(SDC沙盒)DLP文档加密云桌面代表厂家*信达卖咖啡、赛门贴科亿*通、IP噶德、*盾、*途四杰、深*服设计理念以隔离容器加准入技术为基础&#xff0c;构…...

TO-B类软件产品差异化

产品差异化&#xff0c;是在市场众多同质化产品中&#xff0c;突出自身产品亮点的重要方式。对于客户来讲其选择是多种多样的&#xff0c;与其花费大量的时间研究每一家产品的特点&#xff0c;还不如直接选择品牌更大、价格更低的产品来的直接&#xff0c;因此显而易见的突出产…...

设计模式之美-实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

领域驱动设计&#xff08;Domain Driven Design&#xff0c;简称DDD&#xff09;盛行之后&#xff0c;这种基于贫血模型的传统的开发模式就更加被人诟病。而基于充血模型的DDD开发模式越来越被人提倡。所以&#xff0c;我打算用两节课的时间&#xff0c;结合一个虚拟钱包系统的…...

ChatGPT如何训练自己的模型

ChatGPT是一种自然语言处理模型&#xff0c;它的任务是生成自然流畅的对话。如果想要训练自己的ChatGPT模型&#xff0c;需要进行大量的数据收集、预处理、配置训练环境、模型训练、模型评估等过程。本文将详细介绍这些过程&#xff0c;帮助读者了解如何训练一个高品质的ChatGP…...

springboot使用线程池的实际应用(一)

在实际Spring Boot项目中&#xff0c;我们可以使用Java的原生多线程或者使用Spring自带的线程池进行多线程编程。多线程的好处在于能够提高应用程序的运行效率&#xff0c;特别是在某些计算密集型场景下。以下是一些使用多线程的典型场景&#xff1a; 并发处理请求&#xff1a…...

ESP-8266学习笔记

1、学习地址 【XMF09F系列资源】基于MicroPython的ESP8266物联网应用开发-赛教资源目录汇总-小蜜蜂笔记 Quick reference for the ESP8266 — MicroPython latest documentation 2、MicroPython及相关开发资源 3、固件烧录与uPyLoader的使用 烧录教程参考: https://www.…...

Java泛型简单的使用

前言 Java里面的泛型在实际开发中运用的很多&#xff0c;学过C的同学一定知道C的模板&#xff0c;而Java中的泛型&#xff0c;一定程度上和它还是挺像的。 相信写Java的人&#xff0c;大都有用过List的实现类ArrayList。在Java没有泛型之前&#xff0c;它的内部是一个Object的…...

深度探索:Qt CMake工程编译后的自动打包策略

深度探索&#xff1a;Qt CMake工程编译后的自动打包策略 1. 引言&#xff08;Introduction&#xff09;1.1 Qt和CMake的基本概念&#xff08;Basic Concepts of Qt and CMake&#xff09;1.2 自动打包的重要性&#xff08;Importance of Automatic Packaging&#xff09; 2. Qt…...

2.7 编译型和解释型

2.7 编译型和解释型 前面我们使用java和javac命令把Hello&#xff0c;World&#xff01;在控制台输出。那为什么输出&#xff0c;这里我们需要掌握两个知识点。编译型语言和解释型语言。在计算机的高级编程语言就分为编译型语言和解释型语言。而我们的Java既有编译型的特点也有…...

校园网自动登陆(河南科技学院)

1. 介绍 河南科技学院校园网自动登陆&#xff08;新乡的很多系统相似&#xff0c;可能也可以用&#xff1f;&#xff09;&#xff0c;java版。可以实现电脑&#xff0c;路由器&#xff0c;软路由的自动认证wifi,后续会上传docker版本的。 源码地址 github&#xff1a;https://…...

C++11 override和final关键字

C11中的override和final关键字是为了增强代码的编译时类型检查和面向对象设计中的继承机制。 override关键字用于显示地表明派生类中的成员函数覆盖了基类中的虚函数。当派生类中的函数与基类中的虚函数签名不同或者没有使用override关键字时&#xff0c;编译器会给出警告或错…...

kafka的log存储解析

kafka的log存储解析——topic的分区partition分段segment以及索引等 引言Kafka中的Message是以topic为基本单位组织的&#xff0c;不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定 的)&#xff0c;每个…...

4.文件系统

组成 Linux&#xff1a;一切皆文件 索引节点&#xff08;I-node&#xff09; I-node&#xff08;Index Node&#xff09;&#xff1a;文件系统的内部数据结构&#xff0c;用于管理文件的元数据和数据块。 文件的元数据&#xff1a;包括文件的权限、拥有者、大小、时间戳、索引…...

Shell脚本case in esac分支语句应用

记录&#xff1a;434 场景&#xff1a;Shell脚本case in esac分支语句应用。 版本&#xff1a;CentOS Linux release 7.9.2009。 1.case in esac格式 格式&#xff1a; case 值 in 模式1)expression;; 模式2)expression;; 模式n)expression;; esac 解析&#xff1a;case…...

【线性dp必学四道题】线性dp四道经典例题【最长上升子序列】、【最长公共子序列】、【最长公共上升子序列(maxv的由来)】【最长公共子串】

【最长上升子序列】、【最长公共子序列】、【最长公共上升子序列】 最长上升子序列f[i] 表示以i结尾的最长子序列 最长公共子序列f[i][j] 表示 a前i 和 b前j个 最长公共长度 最长公共上升子序列f[i][j]代表所有a[1 ~ i]和b[1 ~ j]中以b[j]结尾的公共上升子序列的集合 最长公共子…...

追寻幸福:探索幸福的关键特征和行为

目录 1. 积极的心态 2. 良好的人际关系 3. 自我接纳和自尊 4. 追求意义和目标 5. 健康的身心状态 6. 感知和实现个人价值 幸福是一个主观的感受&#xff0c;因此不同的人对于幸福的定义和追求方式可能会有所不同。然而&#xff0c;有一些共同的特点和行为模式&#xff0c…...

Redis-02-集群

一、redis5搭建集群 1.1、案例&#xff1a;搭建6台redis主机&#xff0c;配置如下 redis并发量&#xff1a;https://www.gxlcms.com/redis-350423.html主机IP&#xff1a;192.168.168.60~65修改redis配置文件hash槽移动&#xff0c;槽内的数据也随之移动 [root60 ~]# vim /e…...

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第三章——MindSpore云上调试调优

1.ModelArts云上调试调优 ModelArts密钥初始化 详细教程&#xff1a; 初始化OBS服务 创建训练作业 2.MindSpore IDE插件效率提升 通过智能代码块推荐、代码自动补全等特性&#xff0c;提升MindSpore脚本开发效率&#xff0c;对接ModelArts云服务&#xff0c;实现模型训…...

python笔记17_实例演练_二手车折旧分析p2

…… 书接上文 4.车辆等级维度 探查车龄为5年的车辆&#xff0c;折旧价值与车辆等级的关系。 # 筛选出车龄为5的数据创建新表 data_age5 data[data[age] 5] data_age5 # 分组聚合计算均值 data_car_level data_age5.groupby(car_level_name)[lowest_price].mean().reset…...