Java高内存使用率
我有一个Java应用程序的问题。昨天,当我部署它进行测试运行时,我们注意到我们的机器开始交换,即使这不是一个真正的怪物应用程序,如果你知道我的意思的话。 无论如何,我检查了top的结果,发现它消耗了大约100mb的内存(RES在top中)。我试图分析内存并检查是否有内存泄漏,但我找不到。有一份未结清的准备好的声明,我修正了,但它没有什么意义。 我试着设置最小和最大堆大小(有人说最小堆大小不是必需的),但没有任何区别 我现在就是这样运行它的:Java高内存使用率,java,memory-management,memory-leaks,Java,Memory Management,Memory Leaks,我有一个Java应用程序的问题。昨天,当我部署它进行测试运行时,我们注意到我们的机器开始交换,即使这不是一个真正的怪物应用程序,如果你知道我的意思的话。 无论如何,我检查了top的结果,发现它消耗了大约100mb的内存(RES在top中)。我试图分析内存并检查是否有内存泄漏,但我找不到。有一份未结清的准备好的声明,我修正了,但它没有什么意义。 我试着设置最小和最大堆大小(有人说最小堆大小不是必需的),但没有任何区别 我现在就是这样运行它的: #!/bin/sh $JAVA_HOME/bin/j
#!/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的结果:
我不明白的是,我配置了max PermSize和max Heap size,总计72mb。这就足够了,该应用程序运行良好。为什么它仍在消耗109mb的内存?是什么在消耗它?这是一个37mb的差异,这是相当高的比率。(34%).
我不认为这是内存泄漏,因为设置了最大堆大小,并且没有内存不足错误或其他问题
一件相互关联的事情可能是,我用VisualVM做了一个堆转储,然后用EclipseMAT检查了它,它说类加载器中可能存在漏洞。
它是这样说的:
类加载器/组件“sun.misc.Launcher$AppClassLoader”@
0x87efa40“占用9807664(64.90%)字节。记忆是
累积在“”加载的“short[][]”的一个实例中。关键字sun.misc.Launcher$AppClassLoader@0x87efa40
我不太了解这一点,但可能有用
提前谢谢你的帮助
编辑
我找到了这个,也许我无能为力。。。
是否尝试使用JConsole评测应用程序 否则,您也可以使用JProfiler试用版来评测应用程序
但是,检查高内存使用率的第一步应该是检查您是否在应用程序中使用对象集合,如数组、映射、集合、列表等。如果是,则检查它们是否保留对对象的引用(即使未使用)?您是否尝试使用JConsole评测应用程序 否则,您也可以使用JProfiler试用版来评测应用程序 但是,检查高内存使用率的第一步应该是检查您是否在应用程序中使用对象集合,如数组、映射、集合、列表等。如果是,则检查它们是否保留对对象的引用(即使未使用)?Java的内存包括
- 堆空间
- perm-gen空间
- 线程堆栈区域
- 共享库,包括JVM的库(将被共享)
- 直接内存大小
- 内存映射文件大小(将共享)
- 堆空间
- perm-gen空间
- 线程堆栈区域
- 共享库,包括JVM的库(将被共享)
- 直接内存大小
- 内存映射文件大小(将共享)
考虑到37MB的PC内存大约值20美分,我不会太担心 如果每次我的电脑需要更多的内存时我都能投入20美分,我将是一个穷人……;)我明白你的意思,我关心的是运行这个应用程序的服务器有512MB内存,如果我运行这个应用程序,机器就会开始交换。所以这37MB很重要,如果我能减少它,它会对我有帮助。增加内存需要多少钱?这对你也有帮助。我家里没有电视,我有一台看节目的电脑。它有4GB,因为它不值得少一些内存(只省了几磅)@PeterLawrey好吧,我有16GB的RAM,这取决于你要做什么。。。此外,他可能无法访问服务器,因此可能无法增加内存。最后但并非最不重要的一点是:即使我们有非常便宜且几乎无限的内存访问,研究这种东西仍然是一件好事。如果每次我的电脑需要更多内存时我都能投入20美分,我将是一个穷人……;)我明白你的意思,我关心的是运行这个应用程序的服务器有512MB内存,如果我运行这个应用程序,机器就会开始交换。所以这37MB很重要,如果我能减少它,它会对我有帮助。增加内存需要多少钱?这对你也有帮助。我家里没有电视,我有一台看节目的电脑。它有4GB,因为它不值得少一些内存(只省了几磅)@PeterLawrey好吧,我有16GB的RAM,这取决于你要做什么。。。此外,他可能无法访问服务器,因此可能无法增加内存。最后但并非最不重要的一点:即使我们有非常便宜且几乎无限的内存访问权限,研究这类内容仍然是一件好事。我确实做了分析,正如我所写的,我无法发现任何问题。建议尝试调整这些标志:-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio。请参阅“性能选项”下的更多详细信息。正如我所写,我确实进行了分析,但没有发现任何问题。建议尝试调整这些标志:-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio。请参阅“性能选项”下的更多详细信息
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