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

Sun*_*kar 2 java performance scala

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

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

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

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

Vin*_*ati 5

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

先决条件:

  1. 你应该明白java Memory Model,即什么是New Generation(Eden,Survivor-01,Survivor-02), ,Old Generation,,Meta Space 等.HeapStack

    阅读本文以便更好地理解它.

  2. 你应该了解它的Garbage collection工作原理.例如,您应该了解Mark and Sweep算法的工作原理.检查与上面相同的链接.

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

在此输入图像描述

i) Observe  Graphs(Heap one to top right in the snapshot below)  in Monitor Tab. 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

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

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

在此输入图像描述

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

  1. 或者,JMeter如果您认为本地无法重现,请使用.Jmeter可以帮助您基本上广泛地加载测试您的应用程序.

  2. 此外,如果您已集成任何服务器监视工具,也可能会有所帮助.您可以轻松收到有问题的代码的通知.

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

    jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>

    这个链接有一些非常酷的开发人员更详细的答案.

  4. 使用jstat.它附带java,有时非常方便.

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

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

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