2011-05-27 88 views
13

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

有什么想法?

+9

你能发表一些代码吗? – 2011-05-27 11:17:31

+1

你的最大堆设置是什么? – jtahlborn 2011-05-27 11:37:31

+5

只有在JNI库或JVM中存在缺陷时才会出现分段错误。我会尝试的第一件事是确保您有Java 6更新25或最新版本。 – 2011-05-27 11:44:54

回答

0

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

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

+0

完全不相关。直接缓冲区不会出自垃圾收集空间。 – EJP 2011-07-11 04:36:05

+0

@EJP:如果您阅读了错误报告,那么为什么这可能有助于解决这个问题,它提供了一个合理的理由。 – 2011-07-19 19:00:00

+0

你永远无法确定,System.gc()做了什么......所以这不是一个很好的解决任何问题的方法......我同意EJP,并且我会扩展他的声明到这个调用是在大多数情况下案件完全不相关。这只是JVM的一个提示,该程序想要生成一个GC,但你永远无法说出JVM是否会。 – Chris 2011-08-04 07:28:37

2

段错误发生在程序(如JVM)由于内存错误。无论是JVM有一个错误,它使得它尝试使用计算机上的错误的内存部分,当它开始使用那么多的缓冲区空间,或者它试图分配256M的内存,并在这个过程中使用更多的空间电脑给了它。总之,在我看来,64位JVM并不是用它的当前设置来分配那么多空间的。也许您可以尝试配置JVM,以便在启动之前从计算机请求更多内存。 jtahlborn对您询问JVM上最大堆设置的内容是您在再次运行该程序之前应该询问的问题的评论。