我知道 JVM 是一个囤积者,但这对我来说是一个震惊:启动时使用了 180MB netbean 的非常基本的“联系人编辑器”GUI 还添加了一些基本的通用实例?
我并没有制作 1998 年左右的第一人称射击游戏。我请求社区在这一点上启发我。这是 JConsole 打印屏幕:
另外:我有 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,但其中包含一些数据。
分割:
- 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(此处为静态图像数据)
- class 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 最大对象。
关于java - 简单的 Swing 程序即使在空闲时也使用 ~200MB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11218774/