Java高内存使用率

时间:2012-05-25 09:42:58

标签: java memory-management memory-leaks

我的Java应用程序存在问题。昨天,当我部署它进行测试运行时,我们注意到我们的机器开始交换,即使这不是一个真正的怪物应用程序,如果你知道我的意思。 无论如何,我检查了顶部的结果,看到它吃了大约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%)字节。内存是   累积在“short [] []”的一个实例中,由“”加载。关键字sun.misc.Launcher $ AppClassLoader @ 0x87efa40

我无法做到这一点,但可能有用。

提前感谢您的帮助。

修改

我找到了这个,也许我无能为力...... Tomcat memory consumption is more than heap + permgen space

2 个答案:

答案 0 :(得分:4)

Java的内存包括

  • 堆空间。
  • perm gen space
  • 线程堆栈区域。
  • 共享库,包括JVM的库(将被共享)
  • 直接内存大小。
  • 内存映射文件大小(将被共享)

可能还有其他供内部使用。

鉴于37 MB的PC内存价值约20美分,我不会太担心它。 ;)

答案 1 :(得分:1)

您是否尝试使用JConsole配置应用程序http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html 否则,您还可以使用JProfiler试用版来分析应用程序 http://www.ej-technologies.com/products/jprofiler/overview.html?gclid=CKbk1p-Ym7ACFQ176wodgzy4YA

然而,检查高内存使用率的第一步应该是检查您是否在应用程序中使用对象集合,如数组,映射,集合,列表等。如果是,则检查它们是否保留对对象的引用(即使没用过)?