当前位置: 首页 > 知识库问答 >
问题:

超过GC开销限制,但内存充足

苍烨然
2023-03-14

我的JBoss服务器出现了一个奇怪的问题:引发的异常:

我寻找内存不足的情况,但内存可用性看起来很好:

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 2147483648 (2048.0MB)
   NewSize          = 2228224 (2.125MB)
   MaxNewSize       = 4294901760 (4095.9375MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 16777216 (16.0MB)
   MaxPermSize      = 805306368 (768.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 176816128 (168.625MB)
   used     = 110937856 (105.798583984375MB)
   free     = 65878272 (62.826416015625MB)
   62.741932681616014% used
From Space:
   capacity = 38207488 (36.4375MB)
   used     = 27193584 (25.933822631835938MB)
   free     = 11013904 (10.503677368164062MB)
   71.17344118514151% used
To Space:
   capacity = 40960000 (39.0625MB)
   used     = 0 (0.0MB)
   free     = 40960000 (39.0625MB)
   0.0% used
PS Old Generation
   capacity = 1434451968 (1368.0MB)
   used     = 818386128 (780.4738311767578MB)
   free     = 616065840 (587.5261688232422MB)
   57.052180641575866% used
PS Perm Generation
   capacity = 113246208 (108.0MB)
   used     = 109507808 (104.43478393554688MB)
   free     = 3738400 (3.565216064453125MB)
   96.69887401439526% used

以前有没有人遇到过这个GC异常,当时似乎内存很大?

共有1个答案

江阳夏
2023-03-14

这个错误意味着垃圾收集器付出了巨大的努力,但实际工作却很少,另一个症状是,即使不执行任何繁重的任务,应用程序也会变得非常慢,因为它大部分时间都在运行GC,但不要相信我的话,大多数JDK都包括许多工具,如jstat,可以用来监视GC的行为,

根据oracle文档:

如果在垃圾收集中花费了太多时间,并行收集器将抛出一个OutOfMemoryError:如果在垃圾收集中花费了超过98%的总时间,而回收的堆不到2%,则将抛出一个OutOfMemoryError。此特性旨在防止应用程序运行很长时间,但由于堆太小而几乎没有进展或没有进展

如果需要,可以通过在命令行中html" target="_blank">添加选项-xx:-usegcoverheadlimit来禁用此功能

然而,它会带走错误信息,但不会带走潜在的原因,查看内存状况并不像是内存耗尽,所以增加堆大小也没有帮助,很可能问题出在代码的某个地方,检查应用程序中内存最密集的点,寻找可能创建大量对象但没有释放它们的地方,并找到一种方法,要么不创建太多对象,要么在不再需要它们时尽可能释放它们。

 类似资料:
  • 我使用Jmeter将工作负载注入部署在AWS EC2实例上的应用程序。测试必须非常庞大:它持续10个小时,工作负载配置文件具有双峰形状,在5分钟内大约有2600个请求。实际上我有一个m3。部署应用程序的xlarge实例,8 m3。xlarge实例每个实例运行一个jmeter实例。使用python脚本,要注入的工作负载在8个客户机实例之间进行分割,因此在示例中,如果原始工作负载要注入800个请求,那

  • 在Android Studio1.5.1只是通过移动源代码从一个系统到另一个即使干净的构建是成功的,但当代码运行我得到这种错误 java.lang.OutOfMemoryError: GC开销限制超过错误:任务': app: dexDebug'执行失败。 我在应用程序中添加了以下代码。格拉德尔还:

  • 我的Hippo应用程序失败主要是在与我的数据库进行连接时,GC开销超过了限制,有时低于错误。 javax。jcr。RepositoryException:未经检查的异常:java。lang.OutOfMemoryError:Java堆空间 我试图尽可能地清理我的后端。我知道垃圾收集器占用的时间太长,每次运行时恢复的内存很少。所以我需要更新我的堆大小,也可以使用-XX:-usegcoveredlim

  • 使用当我尝试构建我的项目时,这种错误越来越多: 错误:任务“:app:CompiledEbugJavaWithJavac”执行失败。OutofMemoryError:超出GC开销限制 有什么办法解决这个问题吗?

  • 我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以 异常线程"main"java.lang.OutOfMemoryError: GC开销限制超过 输入文件具有以下结构 这是我正在使用的代码: 基本上,它通过in文件并将数据存储到对象HMbicnt(这是一个哈希映射)。一旦在第二列中遇到新值,它应该将对象写入输出文件,释放内存并继续。

  • 问题内容: 我正在尝试建立一个包含2台服务器的Gridgain集群。 使用 GridDataLoader 将.csv文件中的数据(100万至5000万个数据)加载到Gridgain 。 从加载的数据中找到最小值,最大值,平均值等, 当在Eclipse中作为独立应用程序运行时,我得到正确的输出。 但是,在建立集群(eclipse环境中的2个服务器中的2个节点+我的Eclipse环境中的1个节点)的同