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

标签 java scala performance

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

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

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

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

最佳答案

但这需要大量的经验。以下是您可以遵循的一些步骤:

先决条件:

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

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

  2. 你应该明白如何Garbage collection作品。例如你应该明白如何Mark and Sweep算法有效。检查与上面相同的链接是否相同。

现在您可以安装可视化虚拟机了。另外,在 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) 无论如何,您还可以通过 profiler 进行一些分析或采样。和sampler选项卡。

下面是 sampler 的快照。看看它如何清楚地表明哪种数据类型占用了多少内存:

enter image description here

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

  • 或者,使用 JMeter如果您认为在本地您无法复制相同的内容。 Jmeter 基本上可以帮助您对应用程序进行广泛的负载测试。

  • 此外,如果您集成了任何服务器监控工具,这也会有所帮助。您可以轻松收到有问题的代码的通知。

  • 最后,您可以从生产系统下载堆转储并使用可视化虚拟机在本地进行分析。

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

    this链接中有一些非常酷的开发人员提供的更详细的答案。

  • 使用jstat 。它带有java,有时非常方便。

    jstat -gc 2341 //2341 is the java process id.

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

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

    关于java - 解决 java/Scala play 框架应用程序中的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49033563/

    相关文章:

    java - 部署在 Tomcat 7.0.52 中的每个应用程序的 web.xml 都消失了

    java - 可以从 map 外部更改值吗?

    java - "mod 4"与 "& 3"性能对比

    java - 什么是 jvm 预分配异常?

    java - 泛型和静态内部类的问题

    java - 简单的相机代码导致装有 Android V 5.01 的 Nexus4 重启

    scala - Docker Akka-Http 应用程序端点无法访问

    list - 如何在 Scala 的列表列表中求和/合并每个值

    scala - 有没有办法在 a 中声明隐式 val 以进行理解?

    javascript - 使用 React 突出显示列表中的项目时的性能