【问题标题】:Java Segmentation fault when try to allocate buffer sizes larger than 256 MB尝试分配大于 256 MB 的缓冲区大小时出现 Java 分段错误
【发布时间】:2011-09-03 07:55:38
【问题描述】:

我使用的是 64 位 JVM (Oracle),当我尝试分配大于 256 MB 的缓冲区大小时,它会抱怨并抛出“分段错误”错误。我使用 java NIO 分配直接内存缓冲区,并在同一台机器(Linux 64 位)上与 RMI 客户端程序传输和接收这些对象。

有什么想法吗?

【问题讨论】:

  • 你能贴一点代码吗?
  • 你的最大堆设置是多少?
  • 只有在 JNI 库或 JVM 中存在错误时才会发生分段错误。我会尝试的第一件事是确保您拥有 Java 6 update 25 或最新版本。
  • 我使用的是 JDK 1.6 update 25(64 位)JVM,最大堆大小设置为 8000MB,而 DireactMemorySize (-XX:MaxDirectMemorySize=3000M) 设置为 3000MB。我正在使用 jog-amp JOCL(Java-OpenCL 绑定来使用我的分布式(基于 RMI)框架创建所需大小的缓冲区
  • 这可能与我提交的错误报告有关:bugs.sun.com/bugdatabase/view_bug.do?bug_id=7027845

标签: java segmentation-fault nio


【解决方案1】:

由于内存错误,程序(例如 JVM)中会发生分段错误。要么 JVM 有一个错误,导致它在启动以使用那么多缓冲区空间时尝试使用计算机上错误的内存部分,或者它尝试分配 256M 的内存并且在此过程中它使用的空间比电脑给了它。简而言之,在我看来,64 位 JVM 的当前设置并不是为了分配那么多空间而构建的。也许您可以尝试配置 JVM,以便它在启动之前向计算机请求更多内存。 jtahlborn 关于您询问 JVM 上的最大堆设置是什么的评论也是您在再次运行程序之前应该问的问题。

【讨论】:

    【解决方案2】:

    您是否尝试过错误报告中的以下解决方法?

    之前运行 System.gc() ByteBuffer.allocateDirect()...

    【讨论】:

    • 完全不相关。直接缓冲区不会来自垃圾回收空间。
    • @EJP:如果你阅读了错误报告,它给出了一个合理的理由来说明为什么这可能有助于解决问题。
    • 你永远无法确定,System.gc() 会做任何事情......所以这不是解决任何问题的好方法......我同意 EJP,我会将他的声明扩展到那个在大多数情况下,这种调用完全无关紧要。程序想要进行 GC 只是对 JVM 的一个提示,但你永远不能说 JVM 是否会。
    • @Chris 这是一个分段错误,而不是内存不足错误。六年后,您的回答与当时相比毫无意义。
    猜你喜欢
    • 2018-09-19
    • 2021-10-04
    • 2017-05-12
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2019-05-11
    相关资源
    最近更新 更多