即使在空闲状态下,简单的Swing程序占用了约200MB的内存?

10 浏览
0 Comments

即使在空闲状态下,简单的Swing程序占用了约200MB的内存?

我知道JVM是一个囤积者,但这对我来说仍然是一个震惊的事实:使用Netbean的非常基本的“Contact Editor”GUI加上一些基本的通用实例,在启动时使用了180MB?

我没有构建一个1998年左右的第一人称射击游戏。我请求SO社区在这个问题上 enlighten 我。这是一个JConsole的截屏:

\"enter

此外:我在启动时有18个永远不会死的线程。除了初始线程和Swing的分派线程之外,还有其他永远存在的线程吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

我对 Contact Editor 并不熟悉,但嵌入式数据库或模拟器可能是原因。我最喜欢的 JVM 在典型的 Swing GUI 中运行 10 个线程,但只有三个是活动的,并且没有做太多事情。这个 例子 对一个外观上比较繁忙的 程序 进行了分析,而这个 例子 使用了一个人工小的堆来突出显示范围。

0
0 Comments

线程不是真正的内存问题(据我所知,其中约有一半是因为您处于调试模式)。另外一些线程的名称很明显(我的猜测):AWT-Shutdown(检查所有窗口是否销毁,然后退出JVM)、AWT-Windows(从操作系统获取事件)、Java2D清除器(图像数据清理)。

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

比较一下:

  • 一个只有标签和按钮的简单JFrame只需要~2MB(使用-Xmx2MB运行,虽然visualvm显示它有8MB保留(64位Windows最小值?),<2MB已使用)。
  • 我正在开发的复杂GUI程序有70MB的库(jars),启动后大约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个最大的对象。

0