【发布时间】:2012-05-31 21:33:36
【问题描述】:
我的 Java 应用程序有问题。昨天,当我部署它进行测试运行时,我们注意到我们的机器开始交换,即使这不是一个真正的怪物应用程序,如果你明白我的意思。 无论如何,我检查了 top 的结果,发现它消耗了大约 100mb 的内存(顶部的 RES)我试图分析内存并检查是否存在内存泄漏,但我找不到.有一个未关闭的 PreparedStatement,我已修复,但意义不大。 我尝试设置最小和最大堆大小(有人说不需要最小堆大小),但没有任何区别。
这就是我现在的运行方式:
#!/bin/sh
$JAVA_HOME/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9025 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:MaxPermSize=40m -Xmx32M -cp ./jarName.jar uk.co.app.App app.properties
这是top的结果:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16703 root 20 0 316m 109m 6048 S 0.0 20.8 0:14.80 java
我不明白的是,我配置了最大 PermSize 和最大堆大小,它们加起来是 72mb。够了,应用程序运行良好。为什么它还在吃 109mb 的内存,是什么在吃掉它?这是一个 37mb 的差异,这是一个相当高的比例。 (34%)。 我不认为这是内存泄漏,因为设置了最大堆大小并且没有内存不足错误或其他任何错误。
一个有趣的事情可能是我用 VisualVM 做了一个堆转储,然后用 EclipseMAT 检查它,它说类加载器中可能存在泄漏。 它是这样说的:
类加载器/组件“sun.misc.Launcher$AppClassLoader @ 0x87efa40" 占用 9,807,664 (64.90%) 字节。内存为 在“”.Keywords sun.misc.Launcher$AppClassLoader @ 0x87efa40 加载的“short[][]”的一个实例中累积
我不能说太多,但可能有用。
提前感谢您的帮助。
编辑
我找到了这个,也许我无能为力... Tomcat memory consumption is more than heap + permgen space
【问题讨论】:
标签: java memory-management memory-leaks