后端应用程序是在play框架中开发的。
连接到2个不同的数据库mysql和oracle。
2至3个小时后,CPU消耗将激增至100%。
部署6个月后,我找不到同一问题的确切根本原因。但是,在Windows事件查看器中,我发现了MYsql的以下错误
WindowsEventViewer日志
与db的连接472中止了:'mydb'用户:'root'主机:'localhost'(在写入通信数据包时出错)有关更多信息,请参见http://www.mysql.com的帮助和支持中心。
在mysql的WINSERVER.err中找到的日志
2019-12-18T05:07:35.110436Z 472 [注意]中止与数据库的连接472:
'mydb'用户:'root'主机:'localhost'(写错误
通信数据包)
我在应用程序的开头创建了一个数据库连接,整个应用程序都在使用它。
我的数据库配置
db.mydb.hikaricp.minimumIdle = 2 db.mydb.hikaricp.maximumPoolSize = 4
db.mydb.hikaricp.idleTimeout = 600000 #### 10分钟
db.mydb.hikaricp.maxLifetime = 1800000 #### 30分钟
db.mydb.hikaricp.cachePrepStmts = true
db.mydb.hikaricp.prepStmtCacheSize = 250
db.mydb.hikaricp.prepStmtCacheSqlLimit = 2048
db.mydb.hikaricp.useServerPrepStmts = true
db.mydb.hikaricp.useLocalSessionState = true
db.mydb.hikaricp.rewriteBatchedStatements = true
db.mydb.hikaricp.cacheResultSetMetadata = true
db.mydb.hikaricp.cacheServerConfiguration = true
db.mydb.hikaricp.elideSetAutoCommits = true
db.mydb.hikaricp.maintainTimeStats = false
最佳答案
我认为您存在内存泄漏。
是的,我知道,这不是一个好消息:您的应用程序创建了无法删除的对象,因为它们被其他对象引用,因此堆满了,垃圾收集器开始更频繁地运行而没有成功。对CPU使用率有负面影响。
论文验证
您有几种测试内存使用情况的方法,根据问题是否发生,它们会有所不同。
问题在继续
如果可以通过ssh访问生产环境,则可以运行以下命令(以超级用户身份):jstat -gc <pid java> 15000 10
获得这样的东西:
通过这种方式,您将在垃圾收集器活动的最后15秒内采样10个样本。如果FGC(从jvm启动开始的Full Garage Collection事件的数量)频率是每秒1或类似的频率,则可能发生内存泄漏!请记住,通常对于10个YGC(Young Garbage Collection:gc的轻量版本)运行,您只有1个FGC(此数字仅供参考)。
或者,如果您可以在生产环境中具有堆的监视器(VisualVM或类似工具)
在这种情况下,您可以具有如下图:
您可以进行堆转储并对其进行分析,以验证最新的对象。
问题尚未发生
同样,使用堆监视器(VisualVM),您可以在应用程序中使用一段时间,然后强制运行Full Garbage Collector,并验证每次运行时您自己的对象(应用程序的对象)的数量已显着减少或归零。 。
关于java - CPU使用率高峰发挥框架Java MySQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59386099/