在开发使用压缩磁盘索引或磁盘文件的应用程序时,其中部分索引或文件被重复访问(为了论证,让我们说类似于 Zipfian 发行版),我想知道什么时候足够/更好地依赖操作系统级别的缓存(例如,Debian 系统上的内存映射),什么时候在应用程序层上实现某些东西更好(例如,像FileChannel缓冲或 Memcached 或 Java 代码中的自定义 LRU 缓存)。
例如,一篇文章(参考 Solr)主张为操作系统缓存留出可用内存:
操作系统的缓存非常有用,它显着减少了回答查询所需的时间(即使在完全重新启动服务器之后!),因此请始终记住为操作系统保留一些可用内存。
这让我想知道我的应用程序级缓存是否用 LRU Java 对象的弱映射填充内存是弊大于利,尤其是。由于Java在内存开销方面是如此贪婪......而不是使用该内存来缓存一些最终结果对象,操作系统会更好地使用该空间来缓存大量原始压缩数据吗?另一方面,应用层缓存对于平台独立性会更好,无论代码运行在什么操作系统上都允许缓存。
所以我意识到除了运行几个特定的基准测试之外,我不知道如何以有原则的方式回答这个问题。这让我问...
对于是否为应用程序级缓存分配可用内存,或者将该内存用于操作系统级缓存,存在哪些一般准则?
特别是,我希望能够更好地识别编写应用程序级缓存何时是浪费时间,甚至对性能有害。