【问题标题】:Java JAR took High CPU Usage and Memory consumptionJava JAR 占用了高 CPU 使用率和内存消耗
【发布时间】:2019-04-18 05:57:32
【问题描述】:

我在具有 16 GB RAM 的 ubuntu 系统上运行 jar 文件。我在开发应用程序时使用了 Spring Boot 框架、JPA。 我观察到应用程序启动后内存和 CPU 使用率不断增加。

不断增加 CPU 使用率和内存的可能原因是什么?

应用程序正在做什么操作 -> 使用

更新文本文件
    File file = new File(file path);
    OutputStream os = new FileOutputStream(file.getAbsoluteFile());

和读取操作

    FileInputStream inputStream = new FileInputStream(file);
    InputStreamResource resource = new InputStreamResource(inputStream);

以一分钟的频率更新文件。

我尝试在两种情况下运行 jar 并在 tomcat 服务器上部署 war 文件,它们的行为相同。

主要目的是创建 proto-buffer 文本文件。我已经添加了

@Scheduled(fixedDelay = 60000)
@RequestMapping(value = "/test")
public String generateProtoBuf(){
...
}  

所以这个方法每分钟都会触发和更新文本文件。

我公开了另一个 API。

@RequestMapping(path = "/getProtoBuf", method = RequestMethod.GET)
public ResponseEntity<Resource> getProtoBuf() throws IOException {
...
}

此 API 将每分钟调用一次。 文件大小将小于 1 MB。

最初的几个小时应用程序运行正常,但几个小时后,当 cpu 使用率增加 15% 时,它会急剧增加并达到 100%。

【问题讨论】:

  • 文件在加载后是否保留在内存中,还是被垃圾回收?
  • 那些不应该对性能有任何影响。尝试分析应用程序?
  • JViusualM 自带 SDK。
  • @jalako 我没有将文件存储在内存中,文件会定期在某个位置更新。
  • @Buffalo 我试图分析应用程序,但无法找到增加内存和 CPU 使用率的根本原因。

标签: java spring-boot ubuntu protocol-buffers cpu-usage


【解决方案1】:

我建议你找一个占用 CPU 的线程;您可以使用阿里巴巴的Arthas 开源工具来做到这一点

【讨论】:

  • 感谢您的评论,我发现多个线程同时运行。当我同时启动应用程序时,我可以在 htop 命令中找到具有相同应用程序名称的多个 pid。现在,在所有 pid 中,只有最高的显示 cpu 使用率高,所有 pid 消耗相同的内存%
【解决方案2】:

在您的情况下,创建和(自动)垃圾收集大对象可能会导致更高的 CPU 使用率,而不是使用较小的大对象。此外,当 I-O 性能不佳时,它还会在执行繁重的 I-O 操作时降低higher 的 CPU 使用率。

但大多数性能不佳的代码会导致 CPU 使用率过高。检查您的代码,或使用 Java 分析器查找瓶颈。我可以推荐YourKit,因为它免费且易于使用。但是还有许多其他工具可以达到相同的效果。使用分析器运行应用程序时,您将看到导致 CPU 使用率高的函数/方法。

【讨论】:

  • 我完全同意您的宝贵意见。我猜同样的“垃圾收集大对象会导致更高的 CPU 使用率”。绝对感谢yourkit.com/java/profiler 组件,它将帮助我确定确切的根本原因。
  • 很高兴听到这个消息!如果它有助于解决您的问题,请随时点赞。
  • 当然,我会的
猜你喜欢
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2014-05-07
  • 2022-07-26
  • 2015-10-29
  • 1970-01-01
  • 2018-02-07
  • 2013-08-04
相关资源
最近更新 更多