我们应该使用哪些技术来阻止我们的JVM进入OutOfMemory?

时间:2016-11-20 07:36:51

标签: java spring memory-management jvm inversion-of-control

当我们创建一个类的对象时,对象将转到堆,引用变量将被放入堆栈。

我在这里要问的是,有多少对象创建可能导致OutOfMemory错误,而我们的JVM将耗尽内存。

此外,在Spring中,我们使用依赖注入创建对象,然后IOC容器将创建和管理它们及其生命周期。所以问题是所有对象的存储位置以及IOC容器内存不足的可能性。

有任何限制吗?

3 个答案:

答案 0 :(得分:0)

这取决于有多少对象存活时间更长,即某种缓存等。 如果您尝试在内存中加载大型表或文件,则即使堆栈中的对象也可以获得OOM。

如果要阻止OOM,那么您应该知道应用程序的内存使用情况。 使用AppDynamics,Dynatrace或NewRelic等分析器或APM工具查看内存使用模式,或者进行少量堆转储并对其进行分析。

答案 1 :(得分:0)

可以保留的对象数取决于最大堆大小和每个对象的大小。对于典型的4 GB服务器大小,您可以创建数千万个对象。除非您正在加载大量数据,否则极不可能耗尽内存。

答案 2 :(得分:0)

  

有多少对象创建可能导致OutOfMemory错误和我们的JVM   会耗尽内存吗?

这取决于默认配置的对象数和JVM堆大小,或者使用-Xmx参数配置。

  

此外,在Spring中,我们使用依赖注入创建对象然后   IOC容器将创建和管理它们及其生命周期。   所以问题是所有对象都存储在哪里以及它是什么   IOC容器内存不足的可能性?

我们不是使用new运算符手动为类创建对象,而是赋予IOC容器的职责(以受控方式注入依赖项)。因此,无论我们使用new运算符还是IOC容器创建对象,都会创建对象,两者都将最终驻留在JVM中。

因此,IOC容器将仅管理JVM中的所有对象,并且所有对象都将存储在堆内存中,内存不足的可能性取决于上面提到的默认值或-XmX。