如何将Java Swing应用程序保留在交换/页面文件之外?

时间:2014-07-08 21:39:03

标签: java swing operating-system swapfile

所以我有这个Java Swing应用程序,它有一个奇怪的使用模式:它一直没有被使用,但是当它被使用时,它是必不可少的,它是可用的立即。当我立即说,我的意思是,只要用户按下快捷键将其置于前台,就必须为用户输入做好准备。

问题是,Windows(通常是操作系统)倾向于将交换空闲的应用程序放在一起。当应用程序窗口进入前台时,在典型的IDE驱动的系统上,JVM再次加载到内存需要几秒钟,Swing重绘窗口等等。我试图避免这种情况,并以某种方式建议操作系统将应用程序保留在内存中。

我尝试了以下内容:

  1. 使用-Xms JVM选项。这对交换没有任何帮助,虽然它确实有所帮助,但它很难衡量和不一致(换句话说,在大多数情况下失败)。
  2. 在应用内运行定期执行某项操作的任务(浏览数据,重绘主要JPanel等)。这似乎没什么帮助。但也许我还没有想到正确的事情。
  3. 完全关闭交换文件。这确实有帮助,但显然不是建议用于所有设置的东西,而且我无法真正打扰(或指望)用户这样做。
  4. 我很感激任何想法。应用程序是多平台的,但重点是Windows,如果需要,我可以为不同的操作系统做不同的事情。如果可能的话,我愿意在操作系统上玩得很好,但是如果需要,我也准备好玩粗糙。我的想法是操作系统可能没有提供应用程序来传达其偏好的方法,但必须有一种方法来修改应用程序行为,以便操作系统确定应用程序不适合放入交换。

    编辑:我在这个问题上取得了一些进展,使用选项2.我创建了一个TimerTask,每小时触发一次,基本上将JFrame带到前面,即执行jFrame.setVisible(true)和jFrame.toFront()。这确实使主窗口响应!但是,只要需要访问另一部分应用程序,就会再次出现可怕的暂停。这是有道理的,因为操作系统可能只在内存中保留访问的页面。必须有一种方法可以访问JVM中的所有页面而无需在用户面前刷新应用程序窗口,而无需了解特定于应用程序的对象(不希望每次修改应用程序时都更新此代码),并且无需编译器决定访问操作是no-op并跳过它。

1 个答案:

答案 0 :(得分:1)

我确定并非所有操作系统都支持,但看起来这是唯一的方法 - mlockall-agent

  

mlockall-agent.jar是一个可以与any结合使用的Java代理   java应用程序导致应用程序使用的虚拟内存   “锁定”在内存中 - 防止它被交换到磁盘。