4

I've be working with a Java application run through the command-line. It deals with XML files, specially the dblp.xml database which has more than 400MB.

I was using JVM 5 and my app needed sort of 600-700MB of memory to processe the dblp.xml. After updating to JVM 6, it starting needing more than 1gb of memory (something I don't have), although it runs a bit faster.

I'm pretty sure of the memory consumption difference, because I've already tested both again and again in this same computer. Resulting in the same difference of memory consumption.

I didn't set any special parameters, just -Xmx800M or -Xmx1000M. Running with Ubuntu Hardy Heron on a dual core 1.7ghz, with 1,5gb of memory Using only the top/ps commands to measure

Any one have an idea why this occurs? I really wanted to use JVM 6, because in my production server it is the JVM in use, and I'm not quite able to change easily.

Thanks

4

9 回答 9

4

我的建议是使用JProfiler之类的工具来尝试准确掌握内存消耗增加的位置。如果您不能花在 JProfiler 上,请查看这个开源 java 分析工具列表。

猜测性能问题的原因是一个坏主意,因为您的猜测几乎总是错误的,并且您浪费时间优化系统的错误部分。一旦你有了一些客观的数据,你就可以想出一个优化来减少你的内存消耗。

如果较新的 JVM 确实在用内存换取速度(通过缓存),那么很可能有一个 jvm arg 可以用来阻止这种行为。最好的办法是查看 Java 6 的发行说明,看看是否提到了任何此类功能。

于 2008-11-26T04:56:28.237 回答
3

也许您使用了 32 位 1.5 JVM 和 64 位 1.6 JVM?你可以发现,是 32 位还是 64 位 JVM

java -version

与 32 位 JVM 相比,64 位 JVM 需要大约 30% 的内存,因为每个引用需要 8 个字节而不是 4 个字节。

于 2008-11-26T10:14:13.433 回答
1

仅使用 top/ps 命令进行测量

您无法使用top或来衡量 JVM 的内存消耗ps

JVM 相当贪婪地保留内存。有时即使没有尝试通过 GCing 释放已经保留的内存,它也会这样做。(您可以尝试指定 -Xms 参数来更改此设置。阅读内容以了解(更多)更多信息。)

top并且ps仅显示当前保留的内存量,而不是您的 Java 应用程序实际使用的内存!

如果要正确测量已使用的内存,则必须从 Java 本身进行测量。蛮力方法是:

System.gc();
Runtime runtime = Runtime.getRuntime();
long memUsedInBytes = runtime.totalMemory() - runtime.freeMemory();

(请仅用于调试目的,切勿用于生产代码!System.gc()是邪恶的。)

但我猜你在使用 -Xmx800M 和 1.6 时会遇到 OutOfMemoryErrors,而 1.5 可以正常工作。如果是这种情况,这个答案只是一个旁注,因为你在内存消耗方面确实存在差异。

于 2008-11-26T20:01:19.020 回答
0

你可以用 jconsole 检查

x86 是 32 位的。如果您真的想知道内存的使用位置,请获取Eclipse Memory Analyzer

于 2008-11-28T15:47:39.923 回答
0

也许您以前的虚拟机正在运行客户端引擎(即“java -client”),而当前的虚拟机使用服务器引擎(“java -server”),它使用更多内存以获得更高的速度。您可以在“java -version”的输出中看到这一点。要使用的默认引擎可以在 jvm.cfg 中设置(有关详细信息,请参阅http://forums.sun.com/thread.jspa?threadID=5185368&tstart=1314 )。

于 2008-11-28T15:55:13.870 回答
0

你用的是什么JDK?我建议您试用 Sun 的 JDK(服务器版本),因为 JRE(客户端版本)的内存效率不高。

于 2008-11-27T17:37:48.967 回答
0

命令“java -version”中没有任何内容告诉我它是 64 位版本(也不是 32 位),是否有更具体的方法来检查它是否是 64 位版本(尽管我认为不是)。但我都是从“apt-get”中得到的。

我刚刚尝试使用 -d32 参数运行应用程序(强制使用 32 位,数据模型),似乎他使用的内存少了一点,但它仍然比 jvm 5 使用的方式更多

JVM 6:

/usr/lib/jvm/java-6-sun/jre/bin/java -version java version "1.6.0_07" Java(TM) SE Runtime Environment (build 1.6.0_07-b06) Java HotSpot(TM) Client VM ( build 10.0-b23,混合模式,共享)

(在我的服务器机器上)java -version java version "1.6.0" Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) Client VM(build 1.6.0-b105,混合模式)

虚拟机 5:

java -version java version "1.5.0_16" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02) Java HotSpot(TM) Client VM (build 1.5.0_16-b02, 混合模式, 共享)

感谢您的回答

于 2008-11-26T15:11:39.230 回答
0

你用什么来解析xml文件?最初的 Java 6 库中有一个错误,会导致这种行为:

错误 6536111

评论中有解决方法。

于 2008-11-27T16:15:22.313 回答
0

听起来像较新的 JVM 正在用内存空间换取速度(即缓存或其他什么)?

于 2008-11-26T05:31:40.820 回答