Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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 GC在低内存停止和崩溃程序中的应用_Java_Garbage Collection_Heap - Fatal编程技术网

Java GC在低内存停止和崩溃程序中的应用

Java GC在低内存停止和崩溃程序中的应用,java,garbage-collection,heap,Java,Garbage Collection,Heap,我在java程序中使用并行GC。但当jvm的可用内存少于~400mb时,GC开始消耗所有CPU。一段时间后,jvm崩溃,出现java.lang.OutOfMemoryError:GC开销超过了。但是我正在使用Runtime.getRuntime().freemory()打印可用内存量,我确信jvm有大约400mb的可用空间。我试图将-XX:MinHeapFreeRatio设置为1或5,但这使一切变得最糟糕 如何配置GC,或者我应该选择哪一个来防止它消耗所有CPU并使jvm崩溃? 我的jvm标志是

我在java程序中使用并行GC。但当jvm的可用内存少于~400mb时,GC开始消耗所有CPU。一段时间后,jvm崩溃,出现
java.lang.OutOfMemoryError:GC开销超过了
。但是我正在使用
Runtime.getRuntime().freemory()
打印可用内存量,我确信jvm有大约400mb的可用空间。我试图将
-XX:MinHeapFreeRatio
设置为1或5,但这使一切变得最糟糕

如何配置GC,或者我应该选择哪一个来防止它消耗所有CPU并使jvm崩溃? 我的jvm标志是
-XX:+UnlockCommercialFeatures-XX:+FlightRecorder-xmx380m-server-Djava.library.path=“native_libs”

错误 错误
java.lang.OutOfMemoryError:超出GC开销限制
发生在JVM花费大部分时间进行垃圾收集,但在垃圾收集周期结束时无法释放大量内存的情况下。可以找到一个很好的详细描述注意这并不一定意味着您的内存不足!您可能还有很多内存,但是垃圾收集器可能无法释放任何内容,并且很早就放弃了

原因 由于您的意思是在发生此异常时只需要50 mb内存,因此很可能是内存泄漏。仅使用50MB内存不会导致垃圾回收器像这样失败。当仍有对不再需要的对象的引用时,会发生内存泄漏。当有太多的对象仍然可以访问时,垃圾会花费很长时间,垃圾收集器无法释放任何对象,因为程序仍然可以访问这些对象

解决方案
您需要找到内存泄漏的来源。常见的原因是将对象保留在数据结构(如列表、地图和集合)中而不删除它们。您可以进行堆转储,这实际上是将java程序内存中的所有对象保存到一个文件中,然后您可以检查该文件。通过在
java
命令中添加
-XX:+heapdumponootfmemoryerror
标志,可以将java配置为在发生OutOfMemoryException时执行堆转储。有关堆转储存储位置的更多详细信息,请参见此问题。然后,在下次崩溃时,您可以使用类似的工具来检查堆转储,并查看哪些对象正在消耗内存。这将为您指出内存泄漏的方向,以便您能够修复它。

我的应用程序在old gen中有很多内容,因此我了解GC是如何试图为年轻的gen释放足够的内存的,并且经常进行完整的GC。所以,通过减少年轻一代的规模,我扩大了老一代的规模,这是我大量使用的


要减少年轻人的人数,您可以使用
-XX:MaxNewSize
-XX:NewRatio
-XX:NewSize
。我使用了
-XX:MaxNewSize
。您可以在此处了解它

java.lang.OutOfMemoryError
异常是内存泄漏的常见指示

通常,当Java堆中没有足够的空间来分配对象时,会抛出此错误。在这种情况下,垃圾收集器无法提供空间来容纳新对象,堆也无法进一步扩展

此外,当本机内存不足以支持加载Java类时,可能会抛出此错误

在极少数情况下,当执行垃圾收集的时间过长且释放的内存很少时,可能会抛出
java.lang.OutOfMemoryError


详细信息

如何配置GC,或者我应该选择哪一个来防止它消耗所有CPU并使jvm崩溃?当您使用90%的内存时,没有这种神奇的设置。添加更多内存。但在崩溃时,我只需要存储~50mb的数据。为什么我不能对GC说400mb内存没问题?之后我将释放大量内存,因为Java不支持显式内存管理。说它是正常的并不意味着它是正常的,但是较旧(和较慢)的客户端版本(使用
-client
)可能允许较低的内存条件工作。这里没有银弹(但内存很便宜!)内存很便宜,但我是可怜的xD。谢谢你的回答。我将尝试优化内存消耗。如果您只需要50mb,那么我预计最大堆为3800mb时不会出现任何GC问题。。有点不对劲,不是GC。对不起,我错了。在释放出大量内存之前,我还需要50mb的内存。jvm崩溃瞬间的总消耗量约为340MB。我有大约400mb的可用空间。然后你需要做一些调整。首先将可用内存增加到6gb,以使用此标志
-Xmx6g
降低GC的压力。如果这不起作用,请阅读本文。主要的收获是您应该尝试不同的GC算法。还可以使用此命令查看旧对象消耗的内存量
jstat-gcutil
。如果您正在消耗大量旧空间,请尝试调整新比率(如文章所述)。@Ollegger您从何处获得50mb的数字,您确定不需要更多吗?例如,解析一个50mb的xml文件可能需要远远超过50mb的内存。@ILONER谢谢。年轻一代的调音帮助了我<代码>-XX:MaxNewSize
@NickL发生挤压时,我正在创建普通对象。所以我只需要计算我需要创建多少个这样的对象,然后乘以对象的大小。用jol计算物体的大小。