问题:
我有一个产生“客户”的JTabbedPane。每个客户端都是使用URLClassLoader从jar文件加载的applet的实例。所以基本上,每个标签都包含一个游戏小程序。
每次生成选项卡时,任务管理器都会显示正在使用的内存量增加。哪个好。但是,当选项卡关闭时,applet会被停止并销毁,但根据任务管理器的内存使用情况仍然相同。
我尝试过调用System.gc,这是无法保证的,它什么都不做!我尝试将所有对applet的引用归零,但这也没有做任何事情。
我的解决方案,如果可能:
每个标签都有自己的JVM / Process来运行游戏。当Tab关闭时,applet将停止,销毁,并且进程/ JVM使用的内存将被返回给操作系统,因为进程/ JVM已经死了?
我怎么能做这样的事情?是否可以让我的JTabbedPane中的每个Tab运行Jar或创建一个新的JVM来运行它?
如果没有,我如何清除所有关闭标签的内存?
答案 0 :(得分:2)
首先,使用正确的工具进行工作。流程经理不知道 关于JVM的任何事情,它管理着自己的内存。下载 最新版本的VisualVM并安装VisualGC插件。检查 实际发生了什么,而不是用Process猜测 经理。如果您确实没有收回记忆,请使用 VisualVM中的内存分析器或Plumbr。
不要担心内存,除非步骤#1显示内存泄漏:)如果您使用的是内存受限系统,请设置适当的Xmx值。此外,最新的Oracle JRE包括G1GC垃圾收集器选项。当您的应用程序不再需要大堆时,此GC将自动减小堆大小。尝试使用(至少)这些选项运行您的应用程序: