java - 如何使 Java Swing 应用程序远离交换/页面文件?

标签 java swing operating-system swapfile

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

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

我尝试了以下方法:

  1. 使用 -Xms JVM 选项。这对交换并没有真正帮助,虽然它确实有一定帮助,但它很难衡量并且不一致(换句话说,在大多数情况下失败)。
  2. 在应用程序中运行一个定期执行某些操作的任务(检查数据、重绘主 JPanel 等)。这似乎根本没有帮助。但也许我还没有想到要纠正什么。
  3. 完全关闭交换文件。这确实有帮助,但显然不是对所有设置都推荐的东西,我真的不能打扰(或指望)用户这样做。

如果有任何想法,我将不胜感激。应用程序是多平台的,但重点是 Windows,如果需要,我可以为不同的操作系统做不同的事情。如果可能的话,我愿意和 OS 玩得开心,但如果需要的话,我也准备好玩粗暴的游戏。我的想法是,操作系统可能不会为应用程序提供一种方式来传达其偏好,但必须有一种方法来修改应用程序行为,以便操作系统确定该应用程序不是放入交换的好候选者。

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

最佳答案

我敢肯定不是所有的操作系​​统都支持它,但看起来这是唯一的方法 - mlockall-agent

mlockall-agent.jar is a Java Agent that can be used in conjunction with any java application to cause the virtual memory used by the application to be "locked" in memory -- preventing it from being swapped to disk.

关于java - 如何使 Java Swing 应用程序远离交换/页面文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642013/

相关文章:

java - Java 库中有 Decorator 类吗?

java - 如何将适配器放入 bundle 中?

java - 将另一个类中的 JPanel 添加到另一个类中的 JFrame

android - 如何从我的 Android 版本中删除导航栏?

java - 在 Mac 计算机上更新 Java 版本的最佳方法是什么?

java - 具有特定类型但名称未知的 JAXB 元素

linux - 持有自旋锁时内核抢占

c - GCC 有包含但没有库

java - 当 ArrayList 在模型中更新时 JList 应该在 View 中更新

java - 如何覆盖 JFrame 关闭 ('x' ) 按钮的默认监听器?