【问题标题】:Java application memory sizeJava 应用程序内存大小
【发布时间】:2012-01-28 10:18:41
【问题描述】:

当 IntelliJ 或 Eclipse 正在运行时,我可以从底部的进度条中看到它们在应用程序内部使用了多少堆。它始终指示启动时分配的最大大小低于 512 MB 的值。 现在在很多情况下,如果我从操作系统(Linux)看它说应用程序正在使用大约 1300 MB,我知道库、堆栈、内存映射文件......不在堆中...... 但是为什么差距这么大?通常有大约 1GB 的差异...为什么?

谢谢。

【问题讨论】:

  • 使用工具检查应用程序的不同内存大小。例如,使用 jconsole(随您的 jdk 提供)。请参阅java.sun.com/developer/technicalArticles/J2SE/jconsole.html 了解更多信息
  • 你从os tools看到的值是操作系统给进程的内存。在这种情况下,它很可能接近 -Xmx 值。
  • @Jayan 实际上,该应用程序是使用 -Xmx512 运行的......整个应用程序使用了大约 1.3 GB ......所以据我所知,这些值并不接近。
  • @jelle 我会尝试使用该工具来看看它在做什么..

标签: java eclipse memory intellij-idea


【解决方案1】:

这张图可以解释JVM内存使用情况:

如您所见,不仅仅是-Xmx。总进程内存还包括-XX:PermSize、所有线程的堆栈大小、JIT 使用的 JVM 内存和其他内部结构。不要忘记也包含在进程内存中的内存映射文件。 IntelliJ IDEA 使用内存映射文件进行缓存,因此可以增加数百兆字节。

如果您需要详细信息,请使用 JConsole 或 YourKit 等分析器。

【讨论】:

  • 感谢您的回答,我不知道堆栈可能有那么大,或者 mmap 文件可能有数百兆字节......这说明了为什么差异很大......虽然,对我来说它仍然很奇怪,这里的尺寸比 DotNet 大得多......
  • 上图只是一个例子,它显示了在 512K 堆栈大小和指定堆设置(1316 个线程)的 32 位机器上可以创建多少个线程,通常线程数很多较低,但是映射文件确实可以为进程内存增加很多。
【解决方案2】:

值得记住的是,Java 在启动时会分配最大堆大小,这会显示在虚拟内存大小中。 (默认情况下,这与您拥有的内存量成正比)这可能比实际使用的主内存大得多。

我怀疑您正在查看此虚拟内存而不是常驻内存。

如果您在 linux 上使用 pmap,您可以看到所有内存映射区域及其大小。

如果在 Windows 上使用打开的项目重新启动 IntelliJ,它会说它使用 35 MB,大约 100 MB,最大使用 494 M。在任务管理器中显示大小为 173 MB 私有和 196 MB。

【讨论】:

  • 我说的大小1300MB是真实物理内存+swap值的总和……不是我知道几乎没用的虚拟大小值。
  • “交换价值”是什么意思?使用的交换空间通常是全局的,是分配给当前未使用的程序的内存。
  • 如果我打开详细的进程信息,我可以看到这个进程正在使用大约 1 GB 的实际内存和 300 MB 的交换空间(这是特定于进程的,这当然不是整个交换)
  • 您使用的是哪个操作系统?您的进程根本不应该交换。这听起来确实很奇怪。你能捕捉到你得到的信息并将其添加到问题中吗?
  • 我正在使用 Linux Kubuntu 11.10 32 位和 sun java 6。有些东西我不明白... 最近几次内存使用模式与我描述的一样,并且仍然很高...运行 IntelliJ 并监视 Jconsole 实际上将使用率降低了很多,大约是一半...这大约是堆 +(小于 300 MB),这是正常的,并且在使用和不使用 jconsole 时都保持一致。另一方面,在我看来,GWT 开发模式正在消耗大量内存......我可能将这与 IDE 实际使用的内容混淆了。我将重新评估并发布任何有意义的结果。
猜你喜欢
  • 2011-09-27
  • 2018-06-16
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多