【问题标题】:Simple Swing program using ~200MB even when idle?简单的 Swing 程序即使在空闲时也使用 ~200MB?
【发布时间】:2012-06-27 02:54:47
【问题描述】:

我知道 JVM 是一个囤积者,但这让我感到震惊:启动时使用 180MB netbean 非常基本的“联系人编辑器”GUI,还添加了一些基本的通用实例?

我没有制作 1998 年的第一人称射击游戏。我请求 SO 社区在这方面给我启发。这是一个 JConsole 打印屏幕:

另外:我在启动时有 18 个线程永不消亡。除了初始线程和 Swing 的调度线程之外,还有其他线程一直存在吗?

【问题讨论】:

    标签: java swing memory-management jvm jconsole


    【解决方案1】:

    线程并不是真正的内存问题(这 18 个线程中约有一半只是因为您处于调试模式 IIRC)。其他的有很明显的名字(我的猜测):AWT-Shutdown(检查是否所有窗口都处理,然后退出 JVM)、AWT-Windows(从操作系统获取事件)、Java2D 处理程序(图像数据清理)。

    我不知道您正在运行的程序,但如果它基于 Netbeans 平台,可能会增加一些额外的内存需求,但不是 180MB。我猜大部分内存要么没有被使用(只是保留),要么是实际数据占用了内存。

    比较:

    • 一个带有标签和按钮的简单 JFrame 只需要 ~2MB(运行 -Xmx2MB,虽然 visualvm 显示它保留了 8MB(在 64 位 Windows 上最少?),
    • 我使用 70MB 库(jar)开发的复杂 GUI 程序是 开始〜35MB(我猜〜5-10MB只是图标/图像)和之后 使用所有功能(因此几乎所有库代码都已加载,包括 非 GUI 的)~100MB,但其中包括一些数据。

    细分:

    1. java.awt.image.BufferedImage#156 7.056.378
    2. java.awt.image.BufferedImage#415 6.639.738
    3. sun.misc.Launcher$AppClassLoader#1 3.386.545
    4. class com.ces.core.gui.help.WelcomeTab 627.256(此处为静态图片数据)
    5. com.ces.util.resources.Translator 类 408.146(基本上所有文本都显示在 UI 中)
    6. sun.awt.AppContext#1 389.760
    7. java.awt.image.BufferedImage#161 326.120

    大约一半看起来像缓存图像(大背景图像:))我省略了引用相同数据的 int[]/Object[]/HashMap.Entry[])

    如果您想查看示例应用程序的细分 -> VisualVM -> 监视器 -> 堆转储 -> 按保留大小查找 x 个最大对象。

    【讨论】:

      【解决方案2】:

      我不熟悉Contact Editor,但可能是嵌入式数据库或模拟器。我最喜欢的 JVM 为典型的 Swing GUI 运行 10 个线程,但只有 3 个线程处于活动状态,没有一个能真正发挥作用。这个example 描述了一个视觉上“忙碌”的program,而这个example 使用了一个人为的 堆来突出显示范围。

      【讨论】:

        猜你喜欢
        • 2013-03-15
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 2011-07-12
        • 2016-04-10
        • 1970-01-01
        相关资源
        最近更新 更多