【问题标题】: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,但其中包括一些数据。
细分:
- java.awt.image.BufferedImage#156 7.056.378
- java.awt.image.BufferedImage#415 6.639.738
- sun.misc.Launcher$AppClassLoader#1 3.386.545
- class com.ces.core.gui.help.WelcomeTab 627.256(此处为静态图片数据)
- com.ces.util.resources.Translator 类 408.146(基本上所有文本都显示在 UI 中)
- sun.awt.AppContext#1 389.760
- java.awt.image.BufferedImage#161 326.120
大约一半看起来像缓存图像(大背景图像:))我省略了引用相同数据的 int[]/Object[]/HashMap.Entry[])
如果您想查看示例应用程序的细分 -> VisualVM -> 监视器 -> 堆转储 -> 按保留大小查找 x 个最大对象。
【解决方案2】:
我不熟悉Contact Editor,但可能是嵌入式数据库或模拟器。我最喜欢的 JVM 为典型的 Swing GUI 运行 10 个线程,但只有 3 个线程处于活动状态,没有一个能真正发挥作用。这个example 描述了一个视觉上“忙碌”的program,而这个example 使用了一个人为的小 堆来突出显示范围。