平时项目中有时遇到cpu过高的情况,在此基于自己有限的经验写个分享,此处的服务器都是基于linux平台。

cpu的占有线程类型总的来说分为两种:

us :用户空间占用CPU百分比

sy :内核空间占用CPU百分比

在linux下可以通过top命令查看详细,示例如下:

一般来讲CPU us高的解决方法:

CPU us 高的原因主要是执行线程不需要任何挂起动作,且一直执行,导致CPU 没有机会去调度执行其他的线程。

CPU sy高的解决方法:

CPU sy 高的原因主要是线程的运行状态要经常切换,对于这种情况,常见的一种优化方法是减少线程数。

我平时具体的步骤如下:

1.得到线程最高的几个id(ps- process state)

ps  -eLo pid,lwp,pcpu | grep  15285|sort -nk 3

2.导出JAVA线程栈信息

命令:kill -3 [PID] 或者 jstack

3.从栈信息中找到线程数多的几个

命令:sort  文件名 | uniq -c | sort -nk 1

4.分别分析线程数最多的前十个线程和线程占用cpu最高的前10个线程

这步是最关键的,找出这些异常点,比如某个业务功能点占用较高的cpu或者某种类型的线程数量比较多,这个和业务以及具体程序紧密关联的,在此就不多说了。

5.分析占用cpu最高的前10个线程,结果示例如下:

0x1a5:gc线程

"Concurrent Mark-Sweep GC Thread#0" prio=1 tid=0x0000002b29df1400 nid=0x1a5runnable

0x35f:memcache线程

"memcache5-CacheThread" prio=1 tid=0x0000002b3d277de0 nid=0x35frunnable [0x0000000042755000..0x0000000042755c30]

0x35e:memcache线程

"memcache1-CacheThread" prio=1 tid=0x0000002b371212f0 nid=0x35e runnable [0x0000000042654000..0x0000000042654cb0]

0x14e9:RMI线程

"RMI TCPConnection(102)-10.23.241.59" daemon prio=1 tid=0x0000002b37e72790 nid=0x14e9 runnable [0x000000005103c000..0x000000005103deb0]

0x1be:memcache线程

"memcache5-CacheThread" prio=1 tid=0x0000002b3dba4790 nid=0x1be runnable [0x0000000041a48000..0x0000000041a48eb0]

0x1bd:memcache线程

"memcache1-CacheThread" prio=1 tid=0x0000002b3fb70340 nid=0x1bd runnable [0x0000000041947000..0x0000000041947b30]

0x1af:jdk编译线程

"CompilerThread1" daemon prio=1 tid=0x0000002b30e11620 nid=0x1af waiting on condition [0x0000000000000000..0x000000004123f7c0]

0x1ae:jdk编译线程

"CompilerThread0" daemon prio=1 tid=0x0000002b30e10280 nid=0x1ae waiting on condition [0x0000000000000000..0x000000004113e440]

0x1684:http请求线程,通过该线程栈可以看到此处调用的是hibernate查询

"http-8080-Processor123" daemon prio=1 tid=0x0000002b37dfd9d0 nid=0x1684 runnable [0x000000005afd7000..0x000000005afdcd30]

--------------------------------------------------------------------------------------------------------------------------------

6.系统优化

如果找出了哪些功能点占用cpu高,接下来就需要优化了,可以从业务和技术手段两方面来进行,平时工作中比较常用的技术手段:

弹性时间:对高使用率的请求,分散到不同的时间,比如采用队列或异步,减少同一时间处理的请求。

批处理或定时任务:把请求组合成批,这样可以使得时间真真的都有效的用在了处理上,而不是网络传输等准备工作上。(减少网络传输、数据库连接、socket连接)

缓存:将结果缓存起来,空间换时间。

--------------------------------------------------------------------------------------------------------------------------------

7.如果是gc线程比较费时,则需要进一步的定位:

首先查看一下gc策略是否合理,然后用命令jmap -F -dump:live,file=jmap.hprof [PID] 导出内存dump文件,我一般每隔5s导一次,一共导出3次。用Eclipse Memory Analyzer分析导出来的文件,分析是哪个类占用内存比较多,分析出可能存在内存泄露的地方。

注意jvm分配内存时一个大对象的分配比多个小对象的分配效率要低,如果对象比较大,进行拆分能提高效率,具体原因如下:

Java对象所占用的内存主要从堆上进行分配,堆是所有线程共享的,因此在堆上分配内存时需要进行加锁,这导致了创建对象开销比较大。当堆上空间不足时,会触发GC,如果GC后空间仍然不足,则抛出OutOfMemory错误信息。Sun JDK为了提升内存分配的效率,会为每个新创建的线程在新生代的Eden Space上分配一块独立的空间,这块空间称为TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行情况计算而得,可通过-XX:TLABWasteTargetPercent来设置TLAB可占用的Eden Space的百分比,默认值为1%。JVM将根据这个比率、线程数量及线程是否频繁分配对象来给每个线程分配合适大小的TLAB空间 。在TLAB上分配内存时不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配,如果对象过大或TLAB空间已用完,则仍然在堆上进行分配,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

java web对cpu要求_java web服务器cpu占用过高的处理相关推荐

  1. linux服务器怎么查看cpu配置信息,linux服务器cpu信息查看详解

    在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ...

  2. 服务器淘汰cpu组装的电脑,服务器CPU该不该买?

    [前言]在撕逼鱼和某宝上有大量的商家卖服务器CPU主机配置,也经常有小白拿服务器CPU配置来问老哥好不好的问题,今天老哥这篇文章将告诉你服务器CPU到底该不该买?且听老哥分析. [概念]服务器CPU顾 ...

  3. 无盘服务器内存问题,无盘服务器内存占用过高

    无盘服务器内存占用过高 内容精选 换一换 Windows操作系统云服务器蓝屏,如图1所示.使用了来源不明的第三方软件.CPU占用过高导致.因为误操作或者病毒引起的系统文件.注册表损坏.操作系统在蓝屏的 ...

  4. 服务器内存占用太高如何解决及知识点介绍

    背景 服务器内存占用太高 查看内存 free -m 查看服务器内存使用情况,-m的意思是内存显示单位是mb top 查看服务器所有进程占用内存,为了查看方便,可以使用 shift+md可以让进程按照内 ...

  5. java web学什么软件_java web开发是什么?该怎么学习?

    Java中有前端这个开发方向,上回我们说到了javaweb是什么?你们应该对javaweb有了一定的了解了,那你们知道该如何学习web吗?小编这里整理了一些相关知识,快来看看吧. 一.javaweb是 ...

  6. java web初级面试题_Java Web应用程序初学者教程

    java web初级面试题 Java Web Application is used to create dynamic websites. Java provides support for web ...

  7. java项目使用过滤器实例_Java web开发--过滤器篇(详细介绍)

    一. web过滤器的介绍 1.过滤器 在生活中,过滤这种我们时常可见:比如水资源的处理,化学药剂的提取等等.所谓过滤,就是指对某事物的处理进行一定的处理获取相应的结果的一个过程.它可以总结为下: 过滤 ...

  8. java目前开发的背景_Java web 开发构想[一] 背景和形势

    [Java web 开发构想系列 转自JavaEye社区,在此申明] 1.背景.形势 能够进行Web开发的编程语言和技术很多 (1) 动态解释语言 PHP; Perl; Python (Zope, P ...

  9. 服务器cpu型号各个数字,服务器cpu型号 数字

    服务器cpu型号 数字 内容精选 换一换 接口名称GetCloudPhoneServerModelsGetCloudPhoneServerModels功能描述查询云手机服务器的规格列表.查询云手机服务 ...

  10. 2018主流服务器cpu,【热门服务器CPU排行榜】2021热门服务器CPU排名_热门服务器CPU排行榜10强-太平洋产品报价...

    TOP 1 Intel Xeon E5-2689 八核 核心数量 2.6GHz 主频 暂无评分 暂无报价 这款Intel Xeon E5-2689是一款性能很稳定的服务器CPU,能够积极响应服务请求并 ...

最新文章

  1. mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧
  2. Python3NumPy的常用函数
  3. 如何快速查看mysql数据文件存放路径?
  4. python123第三章作业答案_swift playground类似的游戏
  5. 当Grid的数据源是View时,如何使用PeopleSoft自带的Save Function?
  6. MobileNet V2简单总结
  7. 七阶拉丁方阵_【C语言】输出N阶拉丁方阵并统计个数
  8. Registry新建以及版本
  9. C99的新关键字_Bool
  10. c mysql中文乱码解决方案_Linux下c读取MysqL中文乱码解决方案
  11. 计算机维修费税收分类,维修费税收分类编码是多少?
  12. throw Exception
  13. 盘点那些与动植物有关的姓氏,鼠、蛇、蒲、枣、桂...都是姓氏
  14. MATLAB与数学建模:初阶绘图
  15. 2017南开秋奥鹏作业计算机,南开17秋学期《DirectX程序设计》在线作业(资料)...
  16. Java两个网页之间的文件互传_如何让两台 PC 进行文件传输?
  17. 多线程的实际应用场景
  18. JVM 类加载器(引导类加载器、扩展类加载器、系统类加载器、用户自定义类加载器)
  19. yep chain千亿级航母起航——与同济大学达成战略合作
  20. 宝塔UA黑名单怎么设置

热门文章

  1. VS2012 安装番茄助手
  2. js中最简单base64图片流实现自动下载
  3. 【代理】http代理之快代理
  4. 甘肃暴雨强度公式_中国城市新一代暴雨强度公式
  5. 全国大学FTP列表!绝对经典!!!
  6. McAfee麦咖啡8.5企业版高级教程
  7. python云计算1_python云计算服务器
  8. 悼念著名计算机科学学者孙钟秀院士
  9. 条件语句与循环语句:将数字一二三四五六七八九十转化成汉字大写的壹, 贰,叁,肆,伍,陆,柒,捌,玖,拾
  10. 淘宝店铺基础版全屏店招和背景解决方法