解决java / Scala play框架应用程序中的性能问题

时间:2018-02-28 15:53:28

标签: java scala performance

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

偶尔我们会发现CPU或内存使用量出现大幅增长。有时,正在播放的应用程序会停止响应请求。

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

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

1 个答案:

答案 0 :(得分:5)

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

<强>前提条件

  1. 您应该了解java Memory Model,即New GenerationEdenSurvivor-01Survivor-02),Old Generation,{{1 }},Meta SpaceHeap等。

    阅读this以便更好地了解它。

  2. 您应该了解Stack的工作原理。例如您应该了解Garbage collection算法的工作原理。检查上面相同的链接。

  3. 现在您可以安装可视VM。此外,在Mark and Sweep安装插件visual vm时,它会显示在不同空间中使用的内存。您会看到另一个标签visual gc

    enter image description here

    Visual GC

    enter image description here

    **技巧:**您也可以执行手动GC,以观察i) Observe Graphs(Heap one to top right in the snapshot below) in Monitor Tab. 的图形线的陡峭程度以及运行某些代码块时它的填充速度。我多次使用它确实有帮助(特别是如果与调试器一起使用的话)!

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

    iii)无论如何,您还可以通过Used Heap Space isprofiler标签进行一些分析或抽样。

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

    enter image description here

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

    1. 或者,如果您认为本地无法重现,请使用Per Thread Allocation。 Jmeter可以帮助您基本上对您的应用程序进行广泛的测试。

    2. 此外,如果您集成了任何可能有用的服务器监控工具。您可以轻松收到有问题的代码的通知。

    3. 最后,您可以从生产系统下载堆转储,并使用visual vm在本地进行分析。

      JMeter

      this链接可以从一些非常酷的开发者那里获得更详细的答案。

    4. 使用jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>。它附带java,有时非常方便。

        

      jstat -gc 2341 // 2341是java进程ID。

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

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