如何防止Java Swing应用程序脱离交换/页面文件?
因此,我有一个Java Swing应用程序,它有一个奇怪的使用模式:它不是一直在使用,但当它被使用时,它必须立即可用。当我说立即,我的意思是,当用户按下快捷键将其带到前台时,它必须准备好供用户输入 问题是,Windows(通常是操作系统)倾向于将空闲的应用程序交换。当应用程序窗口出现在前台时,在一个典型的IDE驱动的系统上,JVM需要几秒钟才能再次加载到内存中,Swing需要重新绘制窗口等。我试图避免这种情况,并以某种方式建议操作系统将应用程序保留在内存中 我尝试了以下方法:如何防止Java Swing应用程序脱离交换/页面文件?,java,swing,operating-system,swapfile,Java,Swing,Operating System,Swapfile,因此,我有一个Java Swing应用程序,它有一个奇怪的使用模式:它不是一直在使用,但当它被使用时,它必须立即可用。当我说立即,我的意思是,当用户按下快捷键将其带到前台时,它必须准备好供用户输入 问题是,Windows(通常是操作系统)倾向于将空闲的应用程序交换。当应用程序窗口出现在前台时,在一个典型的IDE驱动的系统上,JVM需要几秒钟才能再次加载到内存中,Swing需要重新绘制窗口等。我试图避免这种情况,并以某种方式建议操作系统将应用程序保留在内存中 我尝试了以下方法: 使用-xmsjvm
编辑:我在这个问题上取得了一些进展,选项2。我创建了一个TimerTask,它每小时触发一次,基本上将JFrame置于前端,即执行JFrame.setVisible(true)和JFrame.toFront()。这确实保持了主窗口的响应速度!然而,一旦需要访问应用程序的另一部分,就会再次出现可怕的暂停。这是有道理的,因为操作系统可能只在内存中保存被访问的页面。必须有一种方法可以访问JVM中的所有页面,而无需在用户面前闪烁应用程序窗口,无需知道特定于应用程序的对象(不希望每次修改应用程序时都更新此代码),而且编译器不会判定访问操作不是op并跳过它。我肯定不是所有操作系统都支持这一点,但这似乎是唯一的方法- mlockall-agent.jar是一个Java代理,可以与任何 java应用程序使应用程序使用的虚拟内存 在内存中“锁定”——防止它被交换到磁盘
也许您想告诉操作系统,在决定交换哪些应用程序或在资源不足时交换哪些页面时,您的应用程序应该具有较高的优先级。搜索。在taskmanager中调整pid优先级如何?也许还有其他热点选项,例如XX:LargePageSizeInBytes.With选项2。您是否提高了线程优先级,可能还提高了setDeamon()?不可能,只有本机操作系统才能确定查看蓝色的直接方式是什么、何时、多长时间screen@javajon-我正在使用TimerTask,它对选项2具有正常优先级,而更新GUI的Swing事件调度线程在默认情况下具有略高的优先级。我已经玩了一点线程优先级,但没有发现它会影响被交换的内容。Swapiness很酷,我不知道,但似乎无法影响单个应用程序。在这个针对Windows的SO问题中,有一点关于锁定页面,但它看起来非常粗糙,我不得不求助于JNI:你证明了原因是OS交换文件吗?您是否尝试在操作系统级别禁用交换文件,只是为了验证实际情况?看看你的问题。