Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一段时间后Spring boot内存使用率高_Java_Spring_Spring Boot_Memory Management_Garbage Collection - Fatal编程技术网

Java 一段时间后Spring boot内存使用率高

Java 一段时间后Spring boot内存使用率高,java,spring,spring-boot,memory-management,garbage-collection,Java,Spring,Spring Boot,Memory Management,Garbage Collection,我在digital ocean上部署了一个spring boot应用程序,我当前的droplet(虚拟pc,名为droplet)有1gb内存 我的应用程序有一些cron作业,可以从数据库上的一些API和存储中获取信息,我将对此进行解释: @Scheduled(cron = "50 0 0/12 * * ?") ^这一个从表中清除一些值 @Scheduled(cron = "50 0 0/1 * * ?") ^同上,但适用于另一张表 @Scheduled(cron = "0 0/1 * * *

我在digital ocean上部署了一个spring boot应用程序,我当前的droplet(虚拟pc,名为droplet)有1gb内存

我的应用程序有一些cron作业,可以从数据库上的一些API和存储中获取信息,我将对此进行解释:

@Scheduled(cron = "50 0 0/12 * * ?")
^这一个从表中清除一些值

@Scheduled(cron = "50 0 0/1 * * ?")
^同上,但适用于另一张表

@Scheduled(cron = "0 0/1 * * * ?")
^有两种方法,从API获取信息,做一些数学计算,然后将结果存储在db上

我从监控工具中看到的是,我的内存使用率从未下降,总是上升一点点

大约5小时前,它的使用率为40%,现在为75%

我可以做些什么来清理内存使用?也许是垃圾收集

顺便说一句,我在使用mysql

谢谢

--编辑

我刚刚运行了visualvm,结果如下所示:

探查器:

监视器:


看起来gc实际上正在运行,那么,出了什么问题?也许我需要在digital ocean设置max heap?

听起来你好像有某种内存泄漏,我建议使用分析工具(如免费的VisualVM)运行你的应用程序,并尝试确定内存泄漏的来源


您的Java应用程序或数据库查询可能会出现问题,会占用大量时间并将DB结果存储在Java堆空间中

您需要一个更好的分析工具,它不仅可以告诉您堆的使用情况,还可以指出导致问题的代码

我个人喜欢很多,因为它告诉了所有代码层的问题。此外,它还可免费用于某些用途,并提供了SAAS解决方案,非常易于集成


请查看一下,如果您需要更多信息,请告诉我。

您可以尝试清理实体管理器,因为它试图缓存您插入数据库的内容

entityManager.clear();
不久前,当我在几分钟内导入了几百万条记录时,我也遇到了同样的问题。我在visualvm中得到了非常相似的结果


因此,在每个10k记录之后,我清除了实体管理器,使用的内存不再增加。

在真实的word应用程序中,开发人员和公司花一些钱来增加资源是很有价值的。因此,每个现代应用程序都需要后台以最低内存使用率工作。@Schedule对于JVM来说是一个昂贵的注释。我建议您不要使用此注释,而是使用TaskQueues,如芹菜和Redis。您可以在Redis中重新查询任务,然后Redis发布它们。它对于大型进程和后台进程非常有用。

什么是你在逃避你的cron工作?还有你用的是什么类型的数据库?我用的是mysql,别提了。我运行一个get to a api,返回的值我根据另一个值做一些数学计算,然后将结果保存在db上。每分钟大约有200条记录在db.Mysql上更新,很好,您没有使用内存中的数据库(必须确保)。听起来像是内存泄漏,我认为垃圾收集对你没有帮助。我会仔细检查,以确保每次运行一个cron作业时,您不会持续实例化一些重载/长时间运行的内容。请尝试粘贴这些作业上实际调用的代码。您好-我在spring boot中使用cron作业时也面临同样的问题。我的容器一开始使用了120MB的RAM,两个小时后就达到了140MB。你能指引我吗。