java - 简单的 Swing 程序即使在空闲时也使用 ~200MB?

标签 java swing memory-management jvm jconsole

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

我并没有制作 1998 年左右的第一人称射击游戏。我请求社区在这一点上启发我。这是 JConsole 打印屏幕:

enter image description here

另外:我有 18 个线程在启动时永远不会死。除了初始线程和 Swing 的调度线程之外,是否还有其他始终存在的线程?

最佳答案

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

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

比较:

  • 一个带有标签和按钮的简单 JFrame 仅需要 ~2MB(运行时 -Xmx2MB,尽管 VisualVM 显示它保留了 8MB(64 位 Windows 上的最小值?),<已使用 2MB)。
  • 我使用 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. class 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 最大对象。

关于java - 简单的 Swing 程序即使在空闲时也使用 ~200MB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11218774/

相关文章:

游戏循环的 Java TimerTick 事件

java - 使用 alpha 透明度从 0 到 1 绘制透明渐变

java - 在 Eclipse 中开始使用 Sharpen

java - 如何将数据从保存在 ArrayList 中的 textField 值添加到 JTable?

Java - 自定义形状的可拖动 JFrame

具有单例属性的 iPhone 内存管理

ios - 由于图像,Cocos2d 中的内存警告

c - 分配 char 数组期间出现 SIGABRT 错误

java - 如何在 Selenium 中找到这个元素(页面上的按钮)?

java - 正则表达式文件名模式匹配