java - 当 Java 中的集合超出容量时会发生什么?

标签 java jvm

我有一个服务,它会在内存中暂存所有对它的调用,因为我们不想丢失数据,同时我们需要这个服务永远不会因为任何外部依赖(例如数据库)而失败).然后,这些暂存的调用会在后台定期接收和处理。

如果,出于任何原因,如果调用太多而我们用完了内存,我们需要报警。

所以,简单地说,问题是:当由于资源不足而无法添加列表时,我需要捕获或监视什么异常来通知我?它会导致 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/

相关文章:

java - 数据没有得到持久化

java - 在不使用 JStack 的情况下从卡住的 Java 应用程序获取线程转储

java - 如何使用 PDFBox 获取 PDF 表单中存在的字段类型

java - Spring Retry @Retryable 不重试也不恢复

java - Rhino JS NativeArray 类型

java - 删除数据结构 vector 中的重复项

java - 直接内存会影响 Java 中的压缩指针吗?

java - 为什么JIT是JVM执行引擎的一部分?

java - 如何在 DllMain 调用中维护 JVM 指针并防止调用 JNI_CreateJavaVM 两次