0

我目前正在开发一个运行多个组件的事件驱动系统。最近,我收到了一个紧急需求,要识别运行的 java 组件的内存消耗,以便我们可以在将其部署到 UAT/客户生产环境之前简要了解内存需求。

我们是否有任何 API 可以用来计算 Deep 保留大小,或者可以提供一个公式来计算内存需求。

对此的任何想法肯定会有所帮助。

我已经看到了一些 API(java instrumentation Api),可以使用这些 API 来计算 Shallow 大小,但这并不能满足我的需要。我还发现 java Assist 可以使用它在运行时修改 java 字节码。

4

2 回答 2

1

要识别 java 应用程序的内存消耗,您可以使用分析器。在 jdk 6 或更高版本中,您可以找到 jvisualvm ( https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jvisualvm.html )。

使用 jvisualvm,您可以附加到 java 进程,并且在采样器选项卡中,您可以查看按类类型分组的内存消耗。甚至还有其他强大的分析器(JProfiler就是其中之一)

于 2019-08-23T12:25:51.983 回答
0

启用垃圾收集日志并分析日志。作为奖励,您还可以识别(并修复)异常行为。

要打开 gc 日志记录,请使用以下标志:

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCCause -Xloggc:/gc-%t.log

然后可以使用 JClarity 的 Censum 等多种工具处理此日志文件,或上传到https://gceasy.io/以便于分析。请注意,您将看到应用程序的整体内存消耗,而不是细分。为此,您将不得不使用上面提到的 VisualVM 之类的东西。

于 2019-08-23T12:46:22.017 回答