【问题标题】:Windows task manager javaw.exe memory vs Java Mission ControlWindows 任务管理器 javaw.exe 内存 vs Java Mission Control
【发布时间】:2015-05-06 20:30:11
【问题描述】:

我正在帮助使用我的 Windows 7 机器开发一个 java 应用程序,该机器具有 Java 8 Update 45。我注意到 Windows 任务管理器所说的应用程序使用了多少内存(通过 javaw. exe 图像),以及 Eclipse Memory Analyzer/Java Mission Control 报告的内容。

示例:Java Mission Control 报告使用了 150 MB 的 Java 堆内存,而 Windows 说 javaw.exe 使用了 303 MB 的工作集。我知道 JVM 本身、GC 等可能会有一些开销。

但我也看到它在做 GC。在单击以使内存增长后,JMC 显示已执行 GC,并说已使用 200 MB 的堆。 Windows 报告 619 MB(它从未关闭过)。 Windows 是否没有正确显示 Java 的内存使用情况?应用程序的某些问题导致发生这种情况?

【问题讨论】:

    标签: java memory garbage-collection


    【解决方案1】:

    当 JVM 启动时,它会为堆分配一个连续的内存区域。这块内存可以懒惰地变成真正的内存,但几乎不会传回给操作系统。

    堆只是 JVM 使用的一个内存区域。它对您来说可能是最重要的,但是当您的堆非常小时,与 JVM 使用的其他区域相比,它可能会很小。这包括

    • 本机内存,例如直接 ByteBuffers。
    • GUI 原生组件。
    • 共享库。
    • jar 文件。
    • 元空间(或 perm gen)
    • 线程堆栈内存。

    Windows 是否没有正确显示 Java 的内存使用情况?

    Windows 显示所有使用的内存,而不仅仅是堆使用的部分。

    应用程序的某些问题导致发生这种情况?

    Windows 不知道您使用的最大堆大小是多少。

    【讨论】:

    • 如何防止应用程序占用所有 Windows 内存?有没有办法将它传回操作系统?
    • @user1795832 您需要为应用程序提供您希望它使用的内存量,并让它自己管理内存。设置最大堆不是设置最大内存,而是设置几百 MB 用于 JVM 所做的其他事情通常不是问题(除非你有一个小设备)
    • 给应用程序我希望它使用的内存量是什么意思?只是它可以通过 Xmx 使用的堆数量并从那里放手?
    • @user1795832 您必须考虑到 -Xmx 仅控制一部分内存,如果您尝试调低内存使用量,则控制总内存的一小部分。如果你有一个更大的堆,比如 64 GB,那么堆可能是你唯一需要担心的事情。
    • 我已经尝试过所有这些,当 jconsole 说有足够的堆可供 jvm 使用时,Windows 进程只是显示它不断占用更多内存。我设置了最大 512 MB,一旦它达到约 450 左右,它就会进行垃圾收集,并且堆按预期恢复。但是 Windows java 进程并没有关闭。每当我在应用程序中单击以使其使用堆中的内存时,它都会使用堆,但 Windows 进程会继续上升。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多