解决java / Scala play框架应用程序中的性能问题[已关闭]

问题描述 投票:2回答:1

我们在生产[Java / Scala]中部署了应用程序。当CPU使用率或内存使用量激增时,我们会设置警报。

偶尔我们会看到CPU或内存使用率出现大幅增长。有时,正在运行的应用程序停止响应请求。

我经常在崩溃之前看到最后几次API命中的日志,这样我最近发现其中一个API正在下载大量数据并且内存耗尽。

当生产中出现问题时,我是否可以获得解决一般问题[捕获统计数据的命令/工具]的问题的提示?

java scala performance
1个回答
5
投票

这需要很多经验。以下是您可以遵循的一些步骤:

先决条件:

  1. 你应该了解java Memory Model,即什么是New GenerationEdenSurvivor-01Survivor-02),Old GenerationMeta SpaceHeapStack等。 阅读this以更好地理解它。
  2. 您应该了解Garbage collection的工作原理。例如你应该了解Mark and Sweep算法是如何工作的。检查与上面相同的链接。

现在您可以安装可视VM。另外,在visual vm安装一个插件visual gc它会显示你在不同空间使用的内存。你会看到另一个选项卡Visual GC

enter image description here

i) Observe  Graphs(Heap one to top right in the snapshot below)  in Monitor Tab. 

enter image description here

**技巧:**你也可以执行手动GC来观察Used Heap Space is的图形线是多么陡峭以及它在运行某些代码块时的填充速度。我使用了很多次,它确实有帮助(特别是如果与调试器一起使用)!

ii)另外,如果多线程导致某些问题,请尝试观察线程转储。

iii)在任何情况下,您还可以通过profilersampler选项卡进行一些分析或采样。

以下是sampler的快照。看看它有多清楚地说明了什么数据类型占用了多少内存:

enter image description here

重要:屏幕截图是堆。您可以更改为Per Thread Allocation选项卡以查看每个线程分配。同样,您可以观察CPU消耗。

  1. 或者,如果您认为本地无法重现,请使用JMeter。 Jmeter可以帮助您基本上广泛地加载测试您的应用程序。
  2. 此外,如果您已集成任何服务器监视工具,也可能会有所帮助。您可以轻松收到有问题的代码的通知。
  3. 最后,您可以从生产系统下载堆转储,并使用visual vm在本地进行分析。 jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid> this链接有一些非常酷的开发人员更详细的答案。
  4. 使用jstat。它附带java,有时非常方便。 jstat -gc 2341 // 2341是java进程ID。

这些来自我的经验。但是在这个方向上,永远都不够,我相信随着我面临更多这样的问题,我的知识会不断发展。因此,请练习并进一步探索。

话虽如此,还有其他可用的工具,所以也可以随意找到其他适合您需求的工具。要开始看看Jconsole

© www.soinside.com 2019 - 2024. All rights reserved.