我们有部署在生产环境中的应用程序 [Java/Scala]。当 CPU 使用率或内存使用率出现峰值时,我们会设置警报。
有时我们会看到 CPU 或内存使用量出现大幅上升。有时,正在运行的应用程序会停止响应请求。
我通常会看到崩溃前最后几次 API 命中的日志,这样我最近发现其中一个 API 正在下载大量数据转储,并且内存已耗尽。
当产品出现问题时,我可以获得解决一般问题的提示[用于捕获统计数据的命令/工具]吗?
最佳答案
但这需要大量的经验。以下是您可以遵循的一些步骤:
先决条件:
你应该明白
java Memory Model
即什么是New Generation
(Eden
、Survivor-01
、Survivor-02
)、Old Generation
,Meta Space
,Heap
,Stack
等等阅读this以便更好地理解它。
你应该明白如何
Garbage collection
作品。例如你应该明白如何Mark and Sweep
算法有效。检查与上面相同的链接是否相同。
现在您可以安装可视化虚拟机了。另外,在 visual vm
安装插件 visual gc
它会向您显示不同空间中使用的内存。您将看到另一个选项卡 Visual GC
i) Observe Graphs(Heap one to top right in the snapshot below) in Monitor Tab.
**技巧:** 您也可以执行手动 GC 来观察 Used Heap Space is
的图形线有多陡。以及运行某些代码块时它填满的速度有多快。我使用过它很多次,它确实很有帮助(特别是与调试器一起使用)!
ii) 另外,如果多线程导致一些问题,请尝试观察线程转储。
iii) 无论如何,您还可以通过 profiler
进行一些分析或采样。和sampler
选项卡。
下面是 sampler
的快照。看看它如何清楚地表明哪种数据类型占用了多少内存:
重要:屏幕截图是堆的屏幕截图。您可以更改为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/