我目前正在开发一个运行多个组件的事件驱动系统。最近,我收到了一个紧急要求,要求确定运行的java组件的内存消耗,以便在将其部署到UAT/客户生产环境之前,我们可以对内存需求有一个简要的了解。
我们是否有任何API可以用来计算深度保留大小,或者可以提供一个公式来计算内存需求。
关于这一点的任何想法都肯定会有所帮助。
我已经看过一些Api( java instrumentation Api),可以用来计算浅层大小,但这不能满足我的需要。我还发现了java Assist,它可以在运行时修改java字节码。
发布于 2019-08-23 20:25:52
要识别java应用程序的内存消耗,可以使用分析器。在JDK6或更高版本中,您可以找到jvisualvm (https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jvisualvm.html)。
使用jvisualvm,您可以附加到一个java进程,并且在sampler选项卡中,您可以看到按类类型分组的内存消耗情况。甚至还有其他强大的分析器(JProfiler就是其中之一)
发布于 2019-08-23 20:46:22
启用垃圾收集日志记录并分析日志。作为额外的奖励,你还可以识别(和修复)异常行为。
要打开gc日志记录,请使用以下标志:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCCause -Xloggc:/gc-%t.log
然后,可以在许多工具中处理此日志文件,如JClarity的Censum或将其上传到https://gceasy.io/以便于分析。请注意,您将看到应用程序的整体内存消耗,而不是细目。为此,您必须使用上面提到的VisualVM之类的东西。
https://stackoverflow.com/questions/57624832
复制相似问题