Java JAR占用了大量CPU和内存

时间:2019-04-18 05:57:32

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

我正在具有16 GB RAM的ubuntu系统上运行jar文件。我在开发应用程序时使用了spring boot framework,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并将war文件部署在tomcat服务器上。

主要目的是创建原型缓冲区文本文件。我已添加

@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%。

2 个答案:

答案 0 :(得分:0)

在您的情况下,与处理较少的大对象相比,创建和(自动)垃圾收集大对象会导致更高的CPU使用率。另外,当I-O性能不佳时,如果I-O操作繁重,也会降低higher的CPU使用率。

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

答案 1 :(得分:0)

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