2013-05-28 103 views
0

工艺的问题:新的JVM或者每个选项卡

我有滋生“客户”一个JTabbedPane中。每个客户端都是使用URLClassLoader从jar文件加载的applet实例。所以基本上,每个Tab都包含一个游戏小程序。

每次标签产生时,任务管理器都会显示正在使用的内存量增加。这很好。但是,当选项卡关闭时,该小程序会停止并被销毁,但根据任务管理器的内存使用情况仍然相同。

我试着调用System.gc,这是不能保证的,而且什么也不做!我试着将所有对小程序的引用都置零,但那也什么都不做。

我的解决方案,如果可能的:

每个标签都有自己的JVM /工艺运行游戏。当一个Tab被关闭时,applet会停止,销毁,并且进程/ JVM使用的内存将被返回给操作系统,因为进程/ JVM已经死了?

我该怎么做这样的事情?是否有可能让我的JTabbedPane中的每个Tab运行Jar或创建一个新的JVM来运行它?

如果不是,我如何清除关闭的所有选项卡的内存?

+0

为每个选项卡分配自己的JVM听起来像是不必要的复杂性。也许你有内存泄漏,也许你没有。不能保证JVM-per-tab实际上可以解决这个问题。如果首先验证你真的有内存泄漏,然后找到它并修复它? –

+0

JVM-per-tab对我来说听起来很麻烦:你确定你正在解决一个实际存在的问题吗? –

+0

但我确实验证过。没有泄漏:S我关闭了所有的文件,所有的URLClassLoaders,在调用stop和destroy之前的所有内容。之后,我删除了所有引用。然而,只要Frame在屏幕上,内存仍然在使用中:S。我使用netbeans分析器。只要我关闭一个选项卡,然后按netbeans GC按钮,内存使用已不存在..我在我的应用程序中手动执行此操作,不起作用。 – Brandon

回答

2
  1. 首先,使用正确的工具进行工作。进程管理器不知道关于JVM的任何事情,它管理着它自己的内存。下载 最新版本的VisualVM并安装VisualGC插件。检查 实际发生的是什么,而不是用Process Manager进行猜测。如果您确实没有收回内存,请使用VisualVM中的 内存分析器或Plumbr等工具。

  2. 不要担心内存,除非第1步显示内存泄漏:)如果您在内存受限系统上,请设置适当的Xmx值。另外,最新的Oracle JRE包含一个G1GC垃圾收集器选项。当您的应用程序不再需要大堆时,此GC将自动减小堆大小。尝试使用(至少)这些选项运行你的应用程序:

    • -XX:+ UseAdaptiveSizePolicy
    • -XX:+ UseAdaptiveGCBoundary
    • -XX:+ UseCompressedOops
    • -XX:+ UseG1GC

祝你好运!

+0

没有任何帮助,但我会接受这个我猜无论如何,我猜..该探查器不显示任何泄漏或任何错误。那么我将不得不弄清楚如何自己生成一个JVM。 – Brandon

+0

您是否尝试过JVM选项?在几次不需要额外内存的GC之后,它们应该使JVM将内存释放到操作系统。 –

+0

尝试每一个单独和组合和浑身解数: http://pastebin.com/7M2mam1D 仍然没有..:l感谢您的答复。 – Brandon

相关问题