我有一个服务,它将所有对其进行的调用暂存在内存中,因为我们不想丢失数据,同时我们需要该服务因任何外部依赖项(例如数据库)而失败。然后,这些分阶段的调用会在后台例行接收和处理。
如果出于任何原因,如果调用太多并且内存不足,我们就需要警惕。
所以,简单来说,问题是:当由于资源不足而导致列表添加失败时,我需要捕获或监视什么异常来通知我?它会导致虚拟机本身出现 OOM,还是也存在集合级别限制?
如果没有集合级别限制,您建议我如何监控服务的使用情况?目前,我们有堆使用情况和内存使用情况指标。这些够了吗?此外,JVM 配置为在出现 OOM 错误时终止(这是因为 VM 管理器会在终止时重新启动其管理的任何进程)。
要抛出的异常是OutOfMemoryException
。一旦您的集合耗尽了所有可用的堆空间,则可以在应用程序的任何部分引发此异常。
但是,如果您知道它可能会针对特定集合抛出,那么最好的方法可能是防止这种情况发生,即限制此集合或使用缓存,以便根据需要驱逐并重新加载未使用的实体。对于轻量级缓存实现,我推荐 Guava 的缓存生成器 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html.
UPDATE
由于每个人都建议基于 FS 的存储,因此这是我的轻量级临时提案:
-
缓存生成器 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html从 NoSQL DB 加载序列化数据
-
Kryo https://code.google.com/p/kryo/序列化器将您的对象转换为
byte[]
-
MapDB http://www.mapdb.org/存储(或您喜欢的任何其他嵌入式 NoSQL 解决方案)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)