【问题标题】:Java high memory usageJava 高内存使用率
【发布时间】: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


    【解决方案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

    但是,检查高内存使用情况的第一步应该是检查您是否在应用程序中使用对象集合,如数组、映射、集合、列表等。如果是,则检查它们是否保留对对象的引用(即使未使用)与他们?

    【讨论】:

    • 我确实按照我写的那样进行了分析,但我没有发现任何问题。
    • 建议尝试调整这些标志:-XX:MaxHeapFreeRatio 和 -XX:MinHeapFreeRatio。在“性能选项”下的 oracle.com/technetwork/java/javase/tech/… 查看更多详细信息
    【解决方案2】:

    Java 的内存包括

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

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

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

    【讨论】:

    • 如果每次我的电脑需要更多内存时,我可以扔掉 20 美分,那我就是个穷人...... ;)
    • 我明白你的意思,我关心的重点是运行这个应用程序的服务器有 512 Mb RAM,如果我运行这个应用程序,机器就会开始交换。所以这 37 MB 很重要,如果我能减少它,它会对我有所帮助。
    • 增加内存需要多少钱?这也会对你有所帮助。
    • @brimborium 家里没有电视,我有一台用于观看节目的电脑。它有 4 GB,因为它不值得减少内存(只节省了几磅)
    • @PeterLawrey 好吧,我有 16GB 的内存,这完全取决于你要做什么......另外,他可能无法访问服务器,所以他可能无法增加内存.最后但并非最不重要的一点是:即使我们可以非常便宜且几乎无限制地访问内存,研究这类东西仍然是一件好事。
    猜你喜欢
    • 2017-05-09
    • 2019-07-29
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2021-11-11
    • 2018-07-01
    相关资源
    最近更新 更多