我们在生产[Java / Scala]中部署了应用程序。当CPU使用率或内存使用率出现峰值时,我们会设置警报。
偶尔我们会发现CPU或内存使用量出现大幅增长。有时,正在播放的应用程序会停止响应请求。
我经常看到崩溃前最后几次API命中的日志,这样我最近发现其中一个API正在下载大量数据并且内存耗尽。
在生产中出现问题时,我是否可以获得解决一般问题[捕获统计数据的命令/工具]的提示?
答案 0 :(得分:5)
这需要很多经验。以下是您可以遵循的一些步骤:
<强>前提条件强>:
您应该了解java Memory Model
,即New Generation
(Eden
,Survivor-01
,Survivor-02
),Old Generation
,{{1 }},Meta Space
,Heap
等。
阅读this以便更好地了解它。
您应该了解Stack
的工作原理。例如您应该了解Garbage collection
算法的工作原理。检查上面相同的链接。
现在您可以安装可视VM。此外,在Mark and Sweep
安装插件visual vm
时,它会显示在不同空间中使用的内存。您会看到另一个标签visual gc
Visual GC
**技巧:**您也可以执行手动GC,以观察i) Observe Graphs(Heap one to top right in the snapshot below) in Monitor Tab.
的图形线的陡峭程度以及运行某些代码块时它的填充速度。我多次使用它确实有帮助(特别是如果与调试器一起使用的话)!
ii)另外,如果多线程导致某些问题,请尝试观察线程转储。
iii)无论如何,您还可以通过Used Heap Space is
和profiler
标签进行一些分析或抽样。
以下是sampler
的快照。看看它有多清楚地说明了采用什么数据类型占用了多少内存:
重要提示:屏幕截图是堆的。您可以更改为sampler
选项卡以查看每个线程分配。
同样,您可以观察CPU消耗。
或者,如果您认为本地无法重现,请使用Per Thread Allocation
。 Jmeter可以帮助您基本上对您的应用程序进行广泛的测试。
此外,如果您集成了任何可能有用的服务器监控工具。您可以轻松收到有问题的代码的通知。
最后,您可以从生产系统下载堆转储,并使用visual vm在本地进行分析。
JMeter
this链接可以从一些非常酷的开发者那里获得更详细的答案。
使用jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>
。它附带java,有时非常方便。
jstat -gc 2341 // 2341是java进程ID。
这些来自我的经验。但是在这个方向上,永远都不够,我相信随着我面临更多这样的问题,我的知识会不断发展。因此,请练习并进一步探索。
话虽如此,还有其他可用的工具,所以也可以随意找到其他适合您需求的工具。要开始使用,请查看jstat
。