【问题标题】:Java and virtual memory: Controlling/influencing which objects are kept in main memory?Java 和虚拟内存:控制/影响哪些对象保存在主内存中?
【发布时间】:2012-02-16 09:44:55
【问题描述】:

我正在用 java 编写一个缓存服务器,它将图像数据(jpg、png、tiff 等)缓存在内存中,以便通过 http 进行快速访问。图像由另一个服务渲染,这是一项昂贵的操作,所以我想将它们缓存在我的缓存服务器上。

我从头开始写它有几个原因,所以我要寻找的答案不是[一些聪明的软件产品]

问题:如何在主存中保留某些数据对象,并确保数据在我需要时确实在主存中,而不是由虚拟内存管理器推送到磁盘?也就是说,我如何在 Java 中做到这一点?

更多信息:可以以任何间隔引用对象,例如days 或者说相隔 years 有点极端:-)

编辑:我找到了这个SO post,它询问“你能把对象保存在连续的内存中吗?” - 这不是我要问的问题,虽然它可能会有所帮助,如果对象一直被引用,我想。顺便说一句,这个问题的答案是“否”,显然数组中的值类型除外。

【问题讨论】:

  • "图像由另一个服务渲染,这是一项昂贵的操作,所以我想将它们缓存在我的缓存服务器上。" 什么是昂贵的操作?渲染、网络传输或磁盘访问?如果缓存服务器是远程访问的,例如通过 HTTP,缓存只会帮助避免磁盘访问,这可能不是您的瓶颈。
  • 您的实现将做哪些现有缓存库/框架/系统/应用程序不做的事情?
  • 在 CPU 方面很昂贵。
  • Dave Newton:它是地理地图图像的缓存系统,如 GeoWebCache 和 Map Proxy,但在重要方面与这些系统不同。

标签: java caching memory virtual


【解决方案1】:

我假设您希望将访问时间保持在可预测的低水平,因此您希望避免分页。在 Java 中,管理内存的工具集非常有限。事实上,这是操作系统的工作来跟踪哪些页面是非活动的并且可以被推送到磁盘上。我什至不确定主要操作系统中是否有任何 API 来控制这种行为。

话虽如此,您必须专注于欺骗系统,让他们知道页面实际上是需要的,而这些页面并没有真正使用很长时间。我想你已经知道答案了——只需编写一个异步任务,每秒左右触及缓存中的每个对象。这应该让操作系统相信您的进程仍在积极使用这些内存区域。

悲伤但应该有效。

【讨论】:

  • +1 用于“触摸对象”方法。这是个好主意,但当然不提供任何保证。我想我正在寻找一个操作系统 API 调用来确保它。可以尝试你接近并做一些分析,看看它是否有帮助。
  • 顺便说一句,我本可以选择您的答案作为已接受的答案。这是一个分叉的决定。
  • @PiminKonstantinKefaloukos:我不介意,很高兴我们能提供帮助,祝你好运! :-)
【解决方案2】:

我强烈怀疑您是否可以仅在 Java 中做到这一点。您可能必须通过 JNI 使用 mlock 之类的东西,以及必要的 JNI 咒语将缓存的对象图固定在内存中,这样 GC 就不会移动它们。 [在此处插入奇迹] 将固定的内存压缩成连续的页面,因为这就是 mlock 的操作。

【讨论】:

  • +1 用于 mlock 和 JNI。我对 mlock 不熟悉(对 JNI 也不太熟悉),但会研究一下。我认为 mlock 是 Linux 唯一的东西?
  • Linux+BSD+Mac。对于 Windows,我需要另一种方法,而且(不幸的是?)我也需要 Windows 支持。
  • 关于奇迹部分:我能否将多个图像中的字节放在一个字节数组中,并使用 mlock 将此(可能是连续的)数据固定在内存中,并将其与将索引保存到字节数组中相结合在另一个(内存驻留)数据结构中?
  • @PiminKonstantinKefaloukos:die.net 手册页提到系统调用可以追溯到 SVr4,所以我猜它实际上在 Unixen 上广泛可用。 (Windows 可能需要 JNI 扩展的第二个实现。)
  • @PiminKonstantinKefaloukos 老实说,我不知道如何处理奇迹部分。正如您在问题中提到的那样,没有让 Java 连续分配对象的“理智”方式,因此您必须为此自己管理内存页。如果您可以找到一个分配器库,可以让您指定要在其中工作的任意内存区域,这在 C 中可能会更容易。
猜你喜欢
  • 2011-08-03
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2020-08-08
  • 1970-01-01
  • 2020-05-21
  • 2014-12-16
相关资源
最近更新 更多