即使在空闲状态下,简单的Swing程序占用了约200MB的内存?
即使在空闲状态下,简单的Swing程序占用了约200MB的内存?
我知道JVM是一个囤积者,但这对我来说仍然是一个震惊的事实:使用Netbean的非常基本的“Contact Editor”GUI加上一些基本的通用实例,在启动时使用了180MB?
我没有构建一个1998年左右的第一人称射击游戏。我请求SO社区在这个问题上 enlighten 我。这是一个JConsole的截屏:
此外:我在启动时有18个永远不会死的线程。除了初始线程和Swing的分派线程之外,还有其他永远存在的线程吗?
admin 更改状态以发布 2023年5月21日
线程不是真正的内存问题(据我所知,其中约有一半是因为您处于调试模式)。另外一些线程的名称很明显(我的猜测):AWT-Shutdown(检查所有窗口是否销毁,然后退出JVM)、AWT-Windows(从操作系统获取事件)、Java2D清除器(图像数据清理)。
我不知道您运行的程序,但如果它是基于Netbeans平台的,则可能会增加一些额外的内存要求,但不会增加180MB。我猜大部分内存要么未使用(只是保留),要么是实际占用内存的数据。
比较一下:
- 一个只有标签和按钮的简单JFrame只需要~2MB(使用-Xmx2MB运行,虽然visualvm显示它有8MB保留(64位Windows最小值?),<2MB已使用)。
- 我正在开发的复杂GUI程序有70MB的库(jars),启动后大约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个最大的对象。