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

Java性能优化——操作系统性能监控

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

1.CPU使用率

总述

CPU使用率可以分为用户态CPU使用率系统态CPU使用率
用户态CPU使用率:应用程序代码所执行的时间占CPU总执行时间的百分比。
系统态CPU使用率:应用程序调用操作系统代码所执行的时间占CPU总时间的百分比。如果较高,说明有共享资源的竞争或者大量IO交互操作。 减少系统态CPU使用率,将CPU更多的执行时间分配到应用程序本身,可以提高应用性能。
PS:要提升性能,除了CPU使用率,还要监控单位时间内执行的指令数、每条执行所需的周期等,防止等待状态也被当成了高效执行。

Windows监控CPU使用率

使用任务管理器进行监控。
任务管理器
左上角是CPU使用率总和,右上角是每个CPU的使用率,绿色代表每个CPU使用率,红色代表每个CPU的系统态使用率,前后两者的差代表用户态使用率。

2.CPU调度程序运行队列

总述

CPU调度程序运行队列就是那些已经准备好运行、正在等待可用CPU来执行他们的线程。
虚拟处理器个数= Runtime.getRuntime().availableProcessors()
当队列长度达到虚拟处理器个数的3-4倍时,就需要注意或者进行优化了。
对于上述情况有两种解决措施:

  1. 增加CPU
  2. 对应用程序的算法进行优化来改进CPU使用率。如减少垃圾回收的频率,或者换一个能完成任务但是所需CPU指令更少的算法。

Windows监控CPU调度程序队列

采用性能监视器来处理
性能监视器
用图形中显示的数值(0-100)除以比例10.0就是队列的长度。

3.内存使用率

总述

除了CPU,内存相关属性也会影响性能。如页面调度或页面交换、加锁、线程切换
页面交换:当执行应用程序所需要的内存超过可用物理内存时,就会发生页面交换。具体步骤为将应用程序中最少运行的部分腾出来,置换到磁盘上。如果要访问这部分程序,就需要再将它从磁盘置换到内存。这个步骤非常影响性能。

Windows监控内存利用率

命令typeperf –si 5 "\Memory\Available Mbytes" "\Memory\Pages/sec"(其中-si 5表示每隔5秒打印一次) 监控内存 第一列为时间戳,第二列为可用内存,第三列为每秒页面调度
如果有页面调度,那么可能系统在进行页面交换。如果有页面调度,但内存充足并且系统没有页面交换的时候,说明有应用正在启动。

4.网络I/O使用率

### 总述 分布式java应用的性能和扩展性受到网络带宽和网络I/O性能的影响。如果发送到系统的网络请求太多,系统会排队处理,并导致阻塞,这样会产生延迟。

Windows监控网络I/O使用率

在任务管理器中 监控网络

对网络I/O性能改进的建议

  • 控制并减少请求响应
  • 使用NIO。使用非阻塞socket,减少请求、响应的线程,每次读取请求信息的时候都尽量多的读,每次写响应信息的时候都尽量多的写,充分利用网络I/O。
  • 使用NIO的时候不推荐使用jdk的原生nio,难写,容易出错,推荐使用成熟的nio框架。

5.磁盘I/O使用率

总述

磁盘I/O性能提升的策略:

  1. 更快的存储设备
  2. 文件系统扩展到多个磁盘
  3. 操作系统调优,使得可以缓存大量的文件系统数据结构

减少磁盘I/O的同时也就减少了应用和系统打交道的次数,也就减少了系统态CPU使用率,也就提升了性能。通常使用办法就是利用缓存来处理IO,从而提升性能。

参考文献

Java性能优化权威指南

转载于:https://my.oschina.net/u/1378920/blog/480547

相关文章:

  • WebApp上滑加载数据...
  • J2SE核心开发实战(一)——认识J2SE
  • ajax提交form表单资料详细汇总
  • 项目管理学习笔记之二.工作分解
  • 奇异值分解(We Recommend a Singular Value Decomposition)
  • how to loading .desktop files
  • shell练习-远程监控
  • Entity Framework 之三层架构
  • java发送http的get、post请求
  • 在自己的网站添加关注新浪关注按钮
  • go语言的排序和搜索
  • iOS Sprite Kit教程之场景的设置
  • Https通讯原理
  • 通过javamelody监控web应用的性能指标
  • JS将秒转换为 天-时-分-秒
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • java 多线程基础, 我觉得还是有必要看看的
  • Javascript Math对象和Date对象常用方法详解
  • JAVA之继承和多态
  • Markdown 语法简单说明
  • Netty 4.1 源代码学习:线程模型
  • Quartz初级教程
  • Solarized Scheme
  • 多线程 start 和 run 方法到底有什么区别?
  • 记一次删除Git记录中的大文件的过程
  • 开源地图数据可视化库——mapnik
  • 力扣(LeetCode)56
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 浏览器缓存机制分析
  • 使用common-codec进行md5加密
  • 树莓派 - 使用须知
  • 我这样减少了26.5M Java内存!
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • raise 与 raise ... from 的区别
  • #Lua:Lua调用C++生成的DLL库
  • #pragma once与条件编译
  • (04)odoo视图操作
  • (2)STM32单片机上位机
  • (4)logging(日志模块)
  • (6)设计一个TimeMap
  • (初研) Sentence-embedding fine-tune notebook
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (一)Neo4j下载安装以及初次使用
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (一)为什么要选择C++
  • (已解决)什么是vue导航守卫
  • (转)关于pipe()的详细解析
  • (转)原始图像数据和PDF中的图像数据
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .bat文件调用java类的main方法
  • .Net Web窗口页属性
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net6 webapi log4net完整配置使用流程
  • .sys文件乱码_python vscode输出乱码