【发布时间】:2018-03-14 14:17:03
【问题描述】:
我们正在对我们的项目进行性能测试和调整活动。我使用了 article
中提到的 JVM 配置确切的 JVM 选项是:
set "JAVA_OPTS=-Xms1024m -Xmx1024m
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=50
-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC -Xloggc:C:\logs\garbage_collection.logs
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=100m -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:\logs\heap_dumps\'date'.hprof
-XX:+UnlockDiagnosticVMOptions"
我们仍然看到问题没有解决。我确信我们的代码(线程实现等)和我们使用的外部库(如 log4j 等)中存在一些问题,但我至少希望通过使用这些 JVM 调整选项来提高性能。
Gceasy.io 的报告表明:
您的应用程序似乎由于缺乏计算正在等待 资源 (CPU 或 I/O 周期)。严肃的生产应用程序不应该 由于计算资源而搁浅。在 1 个 GC 事件中,花费了“实时”时间 超过 'usr' + 'sys' 时间。
一些已知的代码问题:
- 一些外部 web 应用程序有大量网络流量,它只接受一个 一次连接。 但我们的申请可以接受这种延迟。
- Log4j 上的一些线程阻塞。我们使用 Log4j 进行控制台、数据库和文件附加。
- MySQL 调优也可能存在问题。但就目前而言,我们想排除这些可能性,只了解可能影响我们执行的任何其他因素。
我希望通过调整,应该有更少的 GC 活动,应该正确管理元空间。但这不是观察到的,为什么?
以下是一些快照:
- 在这里,我们可以了解元空间如何停留在 40MB 并且不超过该值。 还看到了很多 GC 活动
我们的问题可能是什么?需要一些明确的指示!
UPDATE-1:磁盘使用监控
UPDATE-2:添加了带有堆的屏幕截图。
更多更新:好吧,我之前没有提到我们的处理涉及 selenium(测试自动化)执行,它使用 chrome/firefox webdrivers。在监控时,我看到在后台进程中,Chrome 正在使用大量内存。这可能是减速的可能原因吗?
以下是相同的屏幕截图:
其他显示后台进程的图片
EDIT No-5:添加 GC 日志
提前致谢!
【问题讨论】:
-
请张贴一张截图,选择堆选项卡而不是元空间。
-
好的。我将不得不重现这个问题。过段时间会更新。
-
我已经用堆选项卡更新了这个问题。如果您需要更多信息,如线程转储、堆转储等,请告诉我。
-
我注意到您正在将详细的 gc 信息记录到日志文件中。你能把文件的内容也贴出来吗?
-
是的。我已经添加了 GC 日志文件。检查第一个.....
标签: java performance memory-leaks garbage-collection selenium-chromedriver