Java清除内存缓存

3
我正在尝试测试我编写的Java程序,以证明其效率。我有许多不同的测试要运行,并且我正在尝试在运行时分析中精确处理。问题在于,不同的测试可能会访问共同的磁盘上的信息。因此,为了在实验结果上“公平”,我想以某种方式通过编程来清除Java程序正在使用的内部内存,在进行实验之间。换句话说,我希望每个实验都拥有相同的“空白内存/缓存”。
我尝试在实验之间读取一个大文件。我还尝试重新启动我的机器。有趣的是,当我读取一个大文件时,时间是非常糟糕的,而当我简单地重新启动机器时(例如从40秒到5秒),时间要好得多。除了在每次实验之间重新启动机器(这是不可行的)之外,如何正确清除内部内存(即避免来自共同磁盘访问的人工加速实验)?

1
但是你为什么认为空的磁盘缓存是一个现实的情况呢?这只是测试非常罕见的最坏情况。 - Marko Topolnik
谢谢。我同意我正在测试最坏的情况,并且在实践中,事情会变得更好。但是,我仍然希望展示即使在最坏的情况下,我的程序也能很好地工作。 (我不想让我正在撰写有关我的系统的论文的裁判有借口抱怨缓存问题。) - user1797753
这个没有 Java API,但可能有特定于操作系统的方法来实现。所以你用的是哪个操作系统? - nos
请参考 https://dev59.com/MXRB5IYBdhLWcg3w4bKv 获取一些选项。 - nos
这很困难。现代操作系统会缓存最近使用过的文件和目录页面,而根据我所读的资料,在Windows中控制这一点最多也是困难的。即使操作系统不缓存文件,磁盘驱动器也可能会缓存。 - Hot Licks
需要注意的是,一些Java实现确实会缓存文件,也就是说,如果一个类在一个Java进程中被加载,文件映像可能会与后来出现的其他Java进程“共享”。但我认为任何标准的Windows JVM都不会这样做——这主要是针对大型服务器设置的。 - Hot Licks
1个回答

0
正确的清除内存的方法是什么?
重新启动计算机。正如您所说,这可能不是最慢的选项。
计算机被设计为尽可能高效,故意使它们低效意味着要做出一些关于您想要使其低效的程度的假设,因此没有标准的方法来实现此目的。
清除您编写的文件缓存的一种方法是删除它们。如果您想清除磁盘文件的缓存并保留它们,则可以写入一组大于主存储器的文件,并将它们删除。
如果您正在使用Windows,则无论如何都不会使用所有内存来缓存文件。您可以每次写入几百MB大小的大型文件并记录所需的时间。当缓存耗尽时,您会从Java中看到所需时间的急剧增加,此时您可能已经清除了缓存。在此之后,删除它们,您的缓存很可能会因此为空。
这可以帮助您获得可重复的结果,但这不一定与重新启动相同。注意:除非您每次运行应用程序都希望重新启动计算机,否则重新启动后所需的时间可能无意义。

顺便说一下:你应该担心的是操作系统中的磁盘缓存。Java除了在你创建的缓冲区和你编写的代码中缓存文件外,不会缓存文件,因此这些应该在你的控制之下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接