我有一个服务,它会在内存中暂存所有对它的调用,因为我们不想丢失数据,同时我们需要这个服务永远不会因为任何外部依赖(例如数据库)而失败).然后,这些暂存的调用会在后台定期接收和处理。
如果,出于任何原因,如果调用太多而我们用完了内存,我们需要报警。
所以,简单地说,问题是:当由于资源不足而无法添加列表时,我需要捕获或监视什么异常来通知我?它会导致 VM 本身出现 OOM,还是也有集合级别的限制?
如果没有集合级别限制,您建议我如何监控服务的使用情况?目前,我们有堆使用和内存使用指标。那些够了吗?此外,JVM 配置为在出现 OOM 错误时终止(这是因为 VM 管理器随后会重新启动它在终止时管理的任何进程)。
最佳答案
要抛出的异常是OutOfMemoryException
。一旦您的集合耗尽了所有可用的堆空间,就可以在应用程序的任何部分抛出此异常。
但是,如果您知道它可能会因特定集合而被抛出,最好的方法可能是防止这种情况发生,即限制此集合或使用缓存,以便逐出未使用的实体并按需重新加载。对于轻量级缓存实现,我会推荐 Guava 的 CacheBuilder .
更新
既然每个人都建议基于 FS 的存储,这里是我的轻量级建议:
- CacheBuilder从 NoSQL DB 加载序列化数据
- Kryo将您的对象转换为
byte[]
的序列化程序
- MapDB存储(或您喜欢的任何其他嵌入式 NoSQL 解决方案)。
关于java - 当 Java 中的集合超出容量时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19549510/