0

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

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

在此处输入图像描述

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

4

2 回答 2

1

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

于 2012-06-27T03:46:27.020 回答
1

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

我不知道您正在运行的程序,但如果它基于 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 个最大对象。

于 2012-06-27T10:54:57.850 回答