2016-09-01 6 views
1

クロニクルキューで消費される最大メモリを制御できますか? 私はXmx1200mパラメータを指定して、32ビットJavaプロセスで、次の例外が発生します。クロニクルキューで消費される最大メモリを制御できますか?

java.nio.BufferOverflowException 
at net.openhft.chronicle.bytes.MappedBytes.acquireNextByteStore(MappedBytes.java:147) 
at net.openhft.chronicle.bytes.MappedBytes.writeCheckOffset(MappedBytes.java:135) 
at net.openhft.chronicle.bytes.AbstractBytes.compareAndSwapInt(AbstractBytes.java:165) 
at net.openhft.chronicle.wire.AbstractWire.writeFirstHeader(AbstractWire.java:402) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueue$StoreSupplier.acquire(SingleChronicleQueue.java:514) 
at net.openhft.chronicle.queue.impl.WireStorePool.acquire(WireStorePool.java:65) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueue.storeForCycle(SingleChronicleQueue.java:262) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.cycle(SingleChronicleQueueExcerpts.java:1249) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.moveToIndex(SingleChronicleQueueExcerpts.java:1094) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.moveToIndexResult(SingleChronicleQueueExcerpts.java:1080) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.moveToIndex(SingleChronicleQueueExcerpts.java:1073) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.next(SingleChronicleQueueExcerpts.java:828) 
at net.openhft.chronicle.queue.impl.single.SingleChronicleQueueExcerpts$StoreTailer.readingDocument(SingleChronicleQueueExcerpts.java:808) 
at net.openhft.chronicle.queue.ExcerptTailer.readingDocument(ExcerptTailer.java:41) 
at net.openhft.chronicle.wire.MarshallableIn.readBytes(MarshallableIn.java:38) 
at com.pingway.platform.tb.InboundQueue.pop(InboundQueue.java:74) 
at com.pingway.platform.tb.RecordUpdateExecutor$1.run(RecordUpdateExecutor.java:23) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.IOException: java.lang.OutOfMemoryError: Map failed 
at net.openhft.chronicle.core.OS.asAnIOException(OS.java:306) 
at net.openhft.chronicle.core.OS.map(OS.java:282) 
at net.openhft.chronicle.bytes.MappedFile.acquireByteStore(MappedFile.java:186) 
at net.openhft.chronicle.bytes.MappedFile.acquireByteStore(MappedFile.java:141) 
at net.openhft.chronicle.bytes.MappedBytes.acquireNextByteStore(MappedBytes.java:143) 
... 23 more 
Caused by: java.lang.OutOfMemoryError: Map failed 
at sun.nio.ch.FileChannelImpl.map0(Native Method) 
at sun.reflect.GeneratedMethodAccessor131.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at net.openhft.chronicle.core.OS.map0(OS.java:290) 
at net.openhft.chronicle.core.OS.map(OS.java:278) 
... 26 more 

私は768メートルにXmxのを減少させた場合は、例外が消えます。

答えて

0

32ビットプロセスで実行する場合は、メモリマッピングにいくらかのスペースを必要とします。 1.2 GBのヒープは、Win XP(およびそれ以降のWindowsのバージョンでは32ビットエミュレーションシステム)で使用できる最大ヒープサイズに近い値になります。ブロック/チャンクサイズを64 MBのデフォルトは1 MBと言います。これにより、メモリマッピングのサイズが小さくなります。

ただし、64ビットJVMを使用する方がはるかに優れた、より簡単で高速なソリューションです。これにより、実際に約100,000倍の仮想メモリが得られます。

まだ64ビットJVMを使用できない場合は、クロニクルエンジンへのJavaクライアント接続を使用できます。これにより、Chronicle Queueが64ビットで動作するサーバーを実行し、そのデータに32ビットクライアントがアクセスできるようになります。

+0

ありがとうございました!デフォルトのブロック/チャンクサイズはクロニクル設定パラメータですか?どうすれば減らすことができますか? –

+0

@HuiLiキューを作成する前にビルダーで設定することができます。 –

関連する問題