我们在生产[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
算法是如何工作的。检查与上面相同的链接。现在您可以安装可视VM。另外,在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是java进程ID。这些来自我的经验。但是在这个方向上,永远都不够,我相信随着我面临更多这样的问题,我的知识会不断发展。因此,请练习并进一步探索。
话虽如此,还有其他可用的工具,所以也可以随意找到其他适合您需求的工具。要开始看看Jconsole
。