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

时间:2012-06-27 02:54:48

标签: java swing memory-management jvm jconsole

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

我没有建立1998年的第一人称射击游戏。我请求社区在这一点上给我启发。这是一个JConsole打印屏幕:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

我不熟悉Contact Editor,但嵌入式数据库或模拟器可能负责。我最喜欢的JVM为典型的Swing GUI运行10个线程,但只有三个是活动的,没有一个真正做很多。此example个人资料视觉上“忙碌”program,此example使用人工堆来突出显示范围。

答案 1 :(得分:1)

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

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

进行比较:

  • 带有标签和按钮的简单JFrame只需要〜2MB(运行时带有 -Xmx2MB,虽然visualvm显示它有8MB保留(最低64位Windows?),<2MB使用。)
  • 我用70MB的库(jars)开发的复杂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
  8. 大约一半看起来像缓存图像(大背景图像:))我省略了int [] / Object [] / HashMap.Entry []引用相同的数据)

    如果您想查看示例应用的细分 - &gt; VisualVM - &gt;监控 - &gt;堆转储 - &gt;按保留大小查找x个最大的对象。