Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Java中的集合超出容量时会发生什么?_Java_Jvm - Fatal编程技术网

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

当Java中的集合超出容量时会发生什么?,java,jvm,Java,Jvm,我有一个服务,它将所有对它的调用分阶段存储在内存中,因为我们不想丢失数据,同时我们需要这个服务由于任何外部依赖性(例如DB)而失败。然后,这些分阶段呼叫会在后台被例行地接收和处理 如果,出于任何原因,如果有太多的呼叫,我们的内存不足,我们需要发出警报 所以,简单地说,问题是:当一个列表的添加由于资源不足而失败时,我需要捕获或监视什么异常来通知我?它是否会导致VM本身出现OOM,或者是否也存在收集级别限制 如果没有收集级别限制,您会建议我如何监控服务的使用情况?目前,我们有堆使用率和内存使用率指标

我有一个服务,它将所有对它的调用分阶段存储在内存中,因为我们不想丢失数据,同时我们需要这个服务由于任何外部依赖性(例如DB)而失败。然后,这些分阶段呼叫会在后台被例行地接收和处理

如果,出于任何原因,如果有太多的呼叫,我们的内存不足,我们需要发出警报

所以,简单地说,问题是:当一个列表的添加由于资源不足而失败时,我需要捕获或监视什么异常来通知我?它是否会导致VM本身出现OOM,或者是否也存在收集级别限制


如果没有收集级别限制,您会建议我如何监控服务的使用情况?目前,我们有堆使用率和内存使用率指标。这些够了吗?此外,JVM被配置为在OOM错误时终止(这是因为VM管理器会重新启动它在终止时管理的任何进程)。

以下是我在Collection.add规范中找到的内容:

如果集合由于任何原因拒绝添加特定元素,而不是因为它已经包含该元素,则它必须抛出异常(而不是返回false)。这保留了在调用返回后集合始终包含指定元素的不变量


它没有指定哪个异常,因此不同的集合可能会引发不同的异常。

要引发的异常是
OutOfMemoryException
。一旦集合占用了所有可用堆空间,就可以在应用程序的任何部分引发此异常

但是,如果您知道它可能会针对特定集合引发,最好的方法可能是防止这种情况发生,即限制此集合或使用缓存,以便根据需要逐出并重新加载未使用的实体。对于轻量级缓存实现,我推荐Guava的

更新

因为每个人都建议使用基于FS的存储,所以我的轻量级建议如下:

  • 从NoSQL数据库加载序列化数据
  • 序列化程序,用于将对象转换为
    字节[]
  • 存储(或您喜欢的任何其他嵌入式NoSQL解决方案)

    • 我认为让应用程序惨遭失败不是一个理想的设计选择。您应该对集合的大小设置阈值,并决定在这种情况下应该做什么:在某处刷新它(磁盘?),发送通知(JMX/电子邮件),抛出错误(或让OOME传播)


      也就是说,我会给你一个设计建议。从您对该服务的简短而略显晦涩的描述中,我觉得您需要一个工作队列来放置在您的服务之外的某个位置,例如JMS服务器甚至数据库。通过这种方式,您的后台进程将能够从队列(db)中提取请求并处理它,即使您的服务因任何原因而终止

      在记忆方面,你会得到一个OOME。如果您想限制进入集合的元素,您必须自己实现。我想说的是,我们首先应该避免这种情况,而是使用一些基于文件的缓存。这似乎很容易测试。编写一个简单的应用程序,在无限循环中将项目添加到集合中,看看会发生什么。到目前为止,所有的答案都很好,但可惜。。我只能选择一个。因为这篇文章总结了这一切,我认为这是正确的。谢谢你抽出时间!完全有道理,绝对是正确的选择。不过,我将使用基于FS的存储来代替DB(对于我们来说,降低外部依赖性比丢失数据更令人担忧——我们可以处理一些数据丢失的情况)。感谢您抽出时间,因为确保添加数据或以其他方式通知我们对我们很重要,这当然是需要记住的。