Java高内存使用率

标签 java memory-management memory-leaks

我的 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 检查它,它说类加载器中可能存在泄漏。 它是这样说的:

The classloader/component "sun.misc.Launcher$AppClassLoader @ 0x87efa40" occupies 9,807,664 (64.90%) bytes. The memory is accumulated in one instance of "short[][]" loaded by "".Keywords sun.misc.Launcher$AppClassLoader @ 0x87efa40

我不能说太多,但可能会有用。

提前感谢您的帮助。

编辑

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

最佳答案

Java的内存包括

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

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

考虑到 37 MB 的 PC 内存值(value)大约 20 美分,我不会太担心。 ;)

关于Java高内存使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10752080/

相关文章:

java - MediaControllerCompat 内存泄漏

c - Valgrind malloc 泄漏

java - JSF/RichFaces : conditional text styling

java - 为什么静态变量被认为是邪恶的?

java - 芬威克树 java

linux - mmap() : resetting old memory to a zero'd non-resident state

Python:数据在内存中的有效存储

java - 在 Android 应用程序中使用 http 客户端模拟表单发布?

memory - 如何防止latex内存溢出

javascript/jquery 泄漏和浏览器崩溃