Java和虚拟内存:控制/影响哪些对象保存在主内存中?

时间:2012-01-22 21:36:32

标签: java caching memory virtual

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

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

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

更多信息:可以使用任何间隔引用对象,例如或说除了有点极端: - )

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

伤心但应该有效。