2012-01-17 78 views
4

我試着用1,2,3,4 GB的內存啓動進程,但仍然得到相同的錯誤。有小費嗎? gc日誌顯示它運行GC,即使它有足夠的內存。但是,這個錯誤可能與使用NIO的內存映射文件有關。有人以前見過這樣的東西嗎?如果是這樣,你是如何解決它的?打開lucene索引時出錯:映射失敗

$ java -d64 -server -Xmx15g -Xms15g -XX:+UseConcMarkSweepGC -verbose:gc -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/frank/heap.dmp -jar lukeall-3.5.0.jar 
    [Full GC 207648K->28758K(15660544K), 0.1105290 secs] 
    [Full GC 61479K->15416K(15660544K), 0.0654310 secs] 
    [Full GC 69950K->15418K(15660544K), 0.0717170 secs] 
    [Full GC 69952K->15418K(15660544K), 0.0661720 secs] 
    java.io.IOException: Map failed 
     at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:849) 
     at org.apache.lucene.store.MMapDirectory$MMapIndexInput.<init>(MMapDirectory.java:265) 
     at org.apache.lucene.store.MMapDirectory.openInput(MMapDirectory.java:216) 
     at org.apache.lucene.index.SegmentCoreReaders.<init>(SegmentCoreReaders.java:89) 
     at org.apache.lucene.index.SegmentReader.get(SegmentReader.java:115) 
     at org.apache.lucene.index.SegmentReader.get(SegmentReader.java:93) 
     at org.apache.lucene.index.DirectoryReader.<init>(DirectoryReader.java:113) 
     at org.apache.lucene.index.DirectoryReader$1.doBody(DirectoryReader.java:83) 
     at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:754) 
     at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:75) 
     at org.apache.lucene.index.IndexReader.open(IndexReader.java:462) 
     at org.apache.lucene.index.IndexReader.open(IndexReader.java:377) 
     at org.getopt.luke.Luke.openIndex(Unknown Source) 
     at org.getopt.luke.Luke.openOk(Unknown Source) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at thinlet.Thinlet.invokeImpl(Unknown Source) 
     at thinlet.Thinlet.invoke(Unknown Source) 
     at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    Caused by: java.lang.OutOfMemoryError: Map failed 
     at sun.nio.ch.FileChannelImpl.map0(Native Method) 
     at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:846) 
     ... 48 more 
+0

指數有多大? – milan 2012-01-17 09:55:34

+0

@米蘭的大小是44G – user3111525 2012-01-17 10:01:09

回答

13
ulimit -v unlimited 

問題解決了!

+3

+1它也適用於我。請注意:** 1 **'-v可用於shell的虛擬內存的最大數量,在某些系統上可用於其子虛擬機的虛擬內存的最大數量。 ** 2 **'sun.nio.ch.FileChannelImpl.map'消耗內存_outside_ java虛擬機(因此更改'-Xmx'不能解決問題)。該進程耗盡內存不是因爲jvm無法創建對象,而是因爲jvm沒有更多的系統可用內存。 ** 3 **'限制只在初始化重新啓動會話後生效 – Alberto 2012-06-19 15:38:38

+0

也爲我工作,您節省了我的一天。 @Alberto感謝您解釋如何通過盯着-Xmx值無法解決這個錯誤。 – Harald 2014-07-03 20:01:21

+1

我有類似的問題,但ulimit -v unlimited對我來說不是解決方案。我不得不改變max_map_count,請參閱http://stackoverflow.com/questions/11683850/how-much-memory-could-vm-use-in-linux – 2014-09-10 00:12:29