我知道 JVM 是一个囤积者,但这让我感到震惊:使用 netbean 的非常基本的“联系人编辑器”GUI 启动时使用了 180MB,并添加了一些基本的通用实例?
我没有制作 1998 年的第一人称射击游戏。我请求 SO 社区在这方面给我启发。这是一个 JConsole 打印屏幕:
另外:我在启动时有 18 个线程永远不会死。除了初始线程和 Swing 的调度线程之外,是否还有其他线程始终存在?
我知道 JVM 是一个囤积者,但这让我感到震惊:使用 netbean 的非常基本的“联系人编辑器”GUI 启动时使用了 180MB,并添加了一些基本的通用实例?
我没有制作 1998 年的第一人称射击游戏。我请求 SO 社区在这方面给我启发。这是一个 JConsole 打印屏幕:
另外:我在启动时有 18 个线程永远不会死。除了初始线程和 Swing 的调度线程之外,是否还有其他线程始终存在?
线程并不是真正的内存问题(这 18 个线程中约有一半只是因为您处于调试模式 IIRC)。其他的有很明显的名字(我的猜测):AWT-Shutdown(检查是否所有窗口都被处理,然后退出 JVM)、AWT-Windows(从操作系统获取事件)、Java2D 处理程序(图像数据清理)。
我不知道您正在运行的程序,但如果它基于 Netbeans平台,可能会增加一些额外的内存需求,但不是 180MB。我猜大部分内存要么未使用(只是保留),要么是实际数据占用内存。
为了比较:
分解:
大约一半看起来像缓存图像(大背景图像:))我省略了 int[]/Object[]/HashMap.Entry[] ,它指的是相同的数据)
如果您想查看示例应用程序的细分 -> VisualVM -> 监视器 -> 堆转储 -> 按保留大小查找 x 个最大对象。