问题:
我有一个生成“客户端”的 JTabbedPane。每个客户端都是一个使用 URLClassLoader 从 jar 文件加载的 applet 实例。所以基本上,每个选项卡都包含一个游戏小程序。
每次出现选项卡时,任务管理器都会显示正在使用的内存量增加。这很好。但是,当选项卡关闭时,小程序将停止并销毁,但根据任务管理器的内存使用情况仍然相同。
我尝试调用 System.gc,但没有得到保证,而且根本没有任何作用!我尝试清空对该小程序的所有引用,但这也没有任何作用。
我的解决方案(如果可能):
每个选项卡都有自己的运行游戏的 JVM/进程。当关闭一个Tab时,小程序将停止、销毁,并且进程/JVM使用的内存将返回给操作系统,因为进程/JVM死了?
我怎样才能做这样的事情呢?是否可以让 JTabbedPane 中的每个选项卡运行 Jar 或创建一个新的 JVM 来运行它?
如果没有,如何清除所有关闭的标签页的内存?
最佳答案
首先,使用适合工作的正确工具。流程经理不知道 关于 JVM 的任何事情,它管理自己的内存。下载 最新版本的 VisualVM 并安装 VisualGC 插件。检查 实际发生的事情而不是通过流程猜测 经理。如果你确实没有恢复内存,请使用 VisualVM 中的内存分析器或 Plumbr 等工具。
不要担心内存问题,除非您的第 1 步发现内存泄漏:) 如果您使用的是内存受限的系统,请设置适当的 Xmx 值。此外,最新的 Oracle JRE 还包括 G1GC 垃圾收集器选项。当您的应用程序不再需要大堆时,此 GC 将自动减少堆大小。尝试使用(至少)以下选项运行您的应用程序:
- -XX:+UseAdaptiveSizePolicy
- -XX:+使用自适应GCBoundary
- -XX:+UseCompressedOops
- -XX:+使用G1GC
祝你好运!
关于java - 每个选项卡的新 JVM 或进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16782611/