gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:43:42 25 4
gpt4 key购买 nike

我知道 JVM 是一个囤积者,但这对我来说是一个震惊:启动时使用了 180MBnetbean 的非常基本的“联系人编辑器”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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com