- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 java -Xmx240g mypackage.myClass
运行 java
操作系统是 Ubuntu 12.10。
top
表示 MiB Mem 245743 total
,并显示 java 进程从一开始就有 virt 254g
,并且 res
稳步增加到 169g
。那时看起来它开始垃圾收集很多,我认为是因为该程序是单线程的,并且 CPU%
大部分是 100%
最多此时,它在1300-2000左右跳跃(我断定它是多线程垃圾收集器),然后res
慢慢移动到172g
。那时java崩溃了
线程“main”java.lang.OutOfMemoryError 中的异常:Java 堆空间
在 new double[2000][5]
java -version
说
java 版本“1.7.0_15”
OpenJDK 运行环境 (IcedTea7 2.3.7) (7u15-2.3.7-0ubuntu1~12.10)
OpenJDK 64-Bit Server VM(build 23.7-b01,混合模式)
硬件为 Amazon cr1.8xlarge 实例
在我看来,即使有大量可用内存,java 也会崩溃。这显然是不可能的,我必须把一些数字解释错。我应该从哪里了解发生了什么?
编辑:
我没有指定任何 GC 选项。唯一的命令行选项是 -Xmx240g
我的程序成功地处理了许多输入,并且 top
有时说它使用了高达 98.3% 的内存。但是我用某些程序输入重现了上述情况。
编辑2:
这是科学应用。它有巨大的树(1-10 百万个节点),在每个节点中有几个 double
数组,大小约为。 300x3 - 900x5。初始树创建程序后不会分配太多内存。大多数时候,这些数组都会进行一些算术运算。
编辑3:
HotSpot JVM 以同样的方式死机,在 170-172g 标记处大量使用 CPU,并因同样的错误而崩溃。看起来 70-75% 的内存是 JVM 不想跨越的一条神奇线。
最终解决方案:使用 -XX:+UseConcMarkSweepGC -XX:NewRatio=12 程序通过了 170g 标记并且很高兴地进一步工作。
最佳答案
您需要做的第一件事是获取堆转储,这样您就可以准确地计算出 JVM 崩溃时堆的样子。将这组标志添加到命令行:
-XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails
当发生崩溃时,JVM 会将堆写入磁盘。坦率地说,在这么大的堆上需要很长时间。下载 Eclipse MAT或者如果您已经在运行 Eclipse,请安装该插件。从那里,您可以加载堆转储并运行几个 jar 头报告。您需要检查 Leak Suspects 和 Dominator Tree 以查看您的内存去向并确定您没有实际的泄漏。
在那之后,我会推荐你read this document Oracle 关于垃圾收集的文章,但是您可以考虑以下几点:
-XX:+UseConcMarkSweepGC
我从未听说有人在这么大的堆上使用仅并行收集器而侥幸成功。您可以激活并发收集器,并且您需要阅读增量模式并确定它是否适合您的工作负载/硬件组合。
-XX:MinHeapFreeRatio=25
当您进行完整收集时,将其调低以降低垃圾收集器的阈值。这可能会阻止您在执行完整收集时耗尽内存。 40% 是默认值,请尝试使用较小的值。
-XX:NewRatio
我们需要了解更多关于您的实际工作量的信息:这是一个网络应用吗?一个 Swing 应用程序?取决于对象在堆上保持 Activity 的时间长短,将对新的比率值产生影响。默认情况下,像您正在运行的服务器模式 VM 具有相当高的新比率 (8:1),如果您有很多长生命周期对象,这可能不适合您。
关于java - 内存不足错误 : Java heap size when memory is available,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16095439/
我正在分析一个显示一些奇怪的转储:命令 !heap -x -v hexadecimal_address 之间似乎存在矛盾。和 !heap -flt s size_of_block 我正在询问悬空指针。
我试图找到免费商店通常被称为堆的官方(或足够好的)原因。 除了它从数据段的末尾增长这一事实之外,我真的想不出一个很好的理由,尤其是因为它与堆数据结构几乎没有关系。 注意:很多人提到它只是一堆无组织的东
我发现了很多 MinMax Heap 实现,它们将数据存储在一个数组中。这真的很容易实现,这就是我正在寻找不同的东西的方式。我想创建一个 MinMax 堆,只使用堆的元素和指向左 child 和右 c
Ehcache talks about堆内和堆外内存。有什么不同?使用哪些 JVM 参数来配置它们? 最佳答案 堆上存储是指将出现在 Java 堆中的对象(并且也会受到 GC)。另一方面,堆外存储是指
多年来,我一直将 !heap –p –a 用于各种任务。 现在我开始使用最新的 Win8 sdk 中的 WinDbg 6.2.9200 在 Win8 上进行调试。 在这里,我发现 !heap –p –
我试图确定为什么我的应用程序消耗 4GB 的私有(private)字节。所以我做了一个完整的内存转储,将它加载到windbg中。但是使用 !heap -stat -h 进行分析产生不加起来的奇怪结果:
我正在分析 native 内存泄漏的转储,然后我观察到“锁争用”在 !heap –s 输出中。我不记得以前见过这个。这是什么意思? 最佳答案 这是堆管理器的锁争用。高锁争用通常是由大量并发分配请求引起
突然我的应用程序崩溃并弹出这个错误...知道这个错误吗?千辛万苦还是解决不了... 将目标 GC 堆从 111MB 钳制到 96MB Alloc 并发标记扫描 GC 释放了 3(96B) 个 Allo
我需要在应用程序运行时监控 JVM 空间,我使用 JMC 进行监控,但是当我停止 tomcat 时,JMC 不工作。 我的目标是我需要验证当应用程序关闭时所有堆内存(或某些部分)是否被释放以及它释放了
我有一个内存转储。在这个转储中,我有一个句柄为 fd00000 的堆。这是 !heap -s fd00000 命令输出的摘录: 0: Heap 0fd00000 Flags 00
我正在尝试返回一系列流媒体数字的运行中位数。为此,我使用最大堆(将值存储在序列的下半部分)和最小堆(将值存储在序列的上半部分)。 特别是我使用 heapq 模块 ( https://docs.pyth
我知道 Android 平台中有 Dalvik(JVM) 堆和 native 堆。而且 Dalvik GC 在 native 堆上没有工作。但我不确定这是如何工作的,我的意思是 Android 操作系
-Xms是指定初始堆大小还是最小堆大小?我看到不同的观点。有些人喜欢 second answer here ,说它用于初始堆,而其他一些人说它是最小堆大小。 还是说最小尺寸本身就是初始尺寸? 最佳答案
我正在编写一个将大量联系人与 Android 联系人数据库同步的程序。对于大约 700 个联系人,下载工作正常,之后我不断收到内存堆错误,该错误调用无限数量的 GC 语句并最终重新启动手机。我正面临
我正在使用 Apache Ignite ver2.7,使用 Config.xml 设置启动 Ignite 服务器。 ./ignite.sh $IGNITE_HOME/config/config.xml
在 Eclipse IDE 中执行 Web 驱动程序脚本时,出现 Unable to execute dex: Java heap space Java heap space 错误。我已经用 Andr
我有一个带有以下参数的 Java 应用程序,但即使总可用空间大于 45%(可以通过可视化 VM 看到),堆也不会被回收。 JVM 是否有任何理由不释放该堆空间?相同的设置在 Java6 中按预期工作。
我正在查看 ASP.NET 4 应用程序(工作流服务)的性能计数器 .NET CLR Memory -- # Bytes in all Heaps : 44,420,488 .NET CLR M
CentOS Linux 发行版 7.3.1611 gcc 版本 4.8.5 20150623 gperftool 2.4-8.el7 1.my c++ 程序链接 -ltcmalloc 在没有 HEA
我创建了一个Gradle包装器 $ gradle wrapper --gradle-version 5.0 --distribution-type all ...现在有 $ ./gradlew -ve
我是一名优秀的程序员,十分优秀!