java基础总结(三十八)--javaweb项目启动后cpu过高

目录

 

1背景

2分析jvm几个常用命令

3HeapAnalyzer使用


1背景

本文jdk版本默认为8

最近在实际项目中总是遇到,启动web项目后查看服务器的cpu被耗尽的情况。(如果项目正常启动则cpu利用率低于5%即硬件配置完全能够跟的上的情况下。)这里简单总结下几条实用的命令。

cpu过高遇见过两次。

   第一次:项目升级后刚开始正常运行,但是过了半个月左右总是会出现cpu被耗尽的情况。web界面无法访问但后台定时任务依然有在运行。

   分析得知:因刚升级的业务中开了四个定时任务,四个定时任务每分钟都会执行一次,而每个定时任务每执行一次都会通过一个公共的方法将收到的字符串格式的报文转换成bean对象,而该公共方法内部处理数据时使用的jar包不正确(类名和方法名都是同样的只是不同的公司开发的)。这个错的jar包能够实现功能但是每调用一次就会创建无法被回收的class类,虽然正确的jar包也会创建无法被回收的class类,但是如果有问题的jar包每使用一次会创建10个class那么新的jar包每使用一次只会创建1个。

  第二次:项目升级后立刻cpu使用了就占完了,但是界面还是可以操作只是界面反应也只比平时慢了一点点,后台的定时任务大部分都能正常执行,但就是会随机的出现某一任务一直执行不了。

   分析得知:现场的服务器一开始启动时会与约800台设备通讯一次。而每通讯一次会触发给所有设备发送比较大的报文。即会发送800*800次相当于每一分钟服务器能处理一百个任务都要处理三天才能处理完。

2分析jvm几个常用命令

2.1查看当前jvm配置信息

      jps -v

    如果是linux需要切换到当前用户查看当前jvm的参数别查看成其他jvm的配置了

2.2实时的查看当前gc执行的次数

    每隔1秒钟打印出jvm当前每个区域详细使用情况: jstat -gcutil  PID  1000

    每隔1秒钟打印出jvm当前每个区域大概情况: jstat -gc  PID  1000

2.3实时的查看当前jvm加载与卸载的class类数量

   每隔1秒钟打印出jvm当前加载与卸载class的信息:jstat -class PID 1000

2.4查看jvm当前时刻正在执行的任务

    可查看是否有死锁,此刻虚拟机内部正在执行哪些代码,将信息打印到test.log文件中:jstack PID  > test.log 

2.5查看jvm中占用内存最多的对象是什么

     jmap -dump:format=b,file=test.bin PID

    将信息打印到名为test.bin的文件中,该文件至少都是一个G.然后通过HeapAnalyzer工具分析该文件。该工具的具体使用在下面写到。

3HeapAnalyzer使用

     下载地址: https://download.csdn.net/download/lsx2017/11982625

     下载成功后是一个jar包:

直接运行然后导入刚刚的文件会自动分析。分析界面如下

该分析结果对应的java代码如下。

补充:如果是真实的项目中出现了必须马上把cpu降下去,出个补丁包来不及的情况。可根据日志、或者界面的数据等停掉消耗比较大的业务,来暂时使得其他业务运行正常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java EE 项目的目录结构可以根据具体的需求进行灵活设计,但一般情况下,推荐使用以下的标准目录结构: ``` project ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ ├── controller │ │ │ ├── dao │ │ │ ├── entity │ │ │ ├── service │ │ │ └── util │ │ ├── resources │ │ │ ├── mapper │ │ │ └── db.properties │ │ └── webapp │ │ ├── WEB-INF │ │ │ ├── classes │ │ │ ├── lib │ │ │ └── web.xml │ │ ├── css │ │ ├── js │ │ ├── images │ │ └── index.jsp │ └── test │ ├── java │ └── resources ├── target ├── pom.xml └── README.md ``` 其中,各个目录的作用如下: - `src/main/java`:存放项目Java 源代码,按照包名分层,一般包括 `controller`、`dao`、`entity`、`service` 和 `util` 等包; - `src/main/resources`:存放项目的配置文件和资源文件,一般包括数据库连接配置文件 `db.properties`、MyBatis 的 mapper 文件等; - `src/main/webapp`:存放 Web 应用的 Web 资源,包括 JSP 页面、CSS 样式表、JavaScript 脚本等; - `src/test/java`:存放项目的测试代码; - `src/test/resources`:存放测试代码所需要的资源文件; - `target`:存放编译后的 .class 文件、打包后的 .war 文件等; - `pom.xml`:Maven 项目管理工具的配置文件; - `README.md`:项目说明文件。 以上是一种常见的 Java EE 项目目录结构,但并不是唯一的标准。在实际开发中,可以根据项目的具体需求进行合理的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋天的猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值