bitsofproof / supernode

BOP Bitcoin Server API - superseded versions
http://bitsofproof.com
Apache License 2.0
126 stars 61 forks source link

OutOfMemory error? #44

Closed keo closed 11 years ago

keo commented 11 years ago

I am running the supernode as slave and got the following error today:

113310 [INFO] BitcoinPeer Peer-thread-1 Connection to '/Satoshi:0.8.3/' [70001] at localhost/127.0.0.1:8333 Open connections: 1
Exception in thread "Peer selector" java.lang.OutOfMemoryError: Java heap space
    at com.bitsofproof.supernode.core.P2P$Peer.process(P2P.java:196)
    at com.bitsofproof.supernode.core.P2P$Peer.access$1700(P2P.java:55)
    at com.bitsofproof.supernode.core.P2P$1.run(P2P.java:624)
    at java.lang.Thread.run(Thread.java:724)
Exception in thread "Peer-thread-0" java.lang.OutOfMemoryError: Java heap space
    at com.google.protobuf.ByteString.copyFrom(ByteString.java:92)
    at com.google.protobuf.CodedInputStream.readBytes(CodedInputStream.java:289)
    at com.bitsofproof.supernode.model.LevelDBStore$TX$TXOUT$Builder.mergeFrom(LevelDBStore.java:1152)
    at com.bitsofproof.supernode.model.LevelDBStore$TX$TXOUT$Builder.mergeFrom(LevelDBStore.java:954)
    at com.google.protobuf.CodedInputStream.readMessage(CodedInputStream.java:275)
    at com.bitsofproof.supernode.model.LevelDBStore$TX$Builder.mergeFrom(LevelDBStore.java:1983)
    at com.bitsofproof.supernode.model.LevelDBStore$TX$Builder.mergeFrom(LevelDBStore.java:1654)
    at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:300)
    at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:238)
    at com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:162)
    at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:716)
    at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:238)
    at com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:153)
    at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:709)
    at com.bitsofproof.supernode.model.LevelDBStore$TX.parseFrom(LevelDBStore.java:1588)
    at com.bitsofproof.supernode.model.Tx.fromLevelDB(Tx.java:152)
    at com.bitsofproof.supernode.model.LvlStore.readTx(LvlStore.java:70)
    at com.bitsofproof.supernode.model.LvlStore.findTxOuts(LvlStore.java:377)
    at com.bitsofproof.supernode.core.CachedBlockStore.resolveInputsUsingDB(CachedBlockStore.java:1364)
    at com.bitsofproof.supernode.core.CachedBlockStore.resolveInputs(CachedBlockStore.java:1328)
    at com.bitsofproof.supernode.core.CachedBlockStore.validateTransaction(CachedBlockStore.java:1699)
    at com.bitsofproof.supernode.core.TxHandler$7$1.doInTransaction(TxHandler.java:233)
    at com.bitsofproof.supernode.core.TxHandler$7$1.doInTransaction(TxHandler.java:223)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
    at com.bitsofproof.supernode.core.TxHandler$7.run(TxHandler.java:222)
    at com.bitsofproof.supernode.core.CachedBlockStore.runInCacheContext(CachedBlockStore.java:125)
    at com.bitsofproof.supernode.core.TxHandler.validateCacheAndSend(TxHandler.java:213)
    at com.bitsofproof.supernode.core.TxHandler$5.process(TxHandler.java:183)
    at com.bitsofproof.supernode.core.TxHandler$5.process(TxHandler.java:176)
    at com.bitsofproof.supernode.core.BitcoinPeer.receive(BitcoinPeer.java:516)
    at com.bitsofproof.supernode.core.P2P$Peer$3.run(P2P.java:297)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

Should I simply increase heap space?

UPDATE:

I restarted it and it seems the blockchain download progress got to a point where it's having problems:

$ java -server -Xmx2g -jar server/target/bitsofproof-server-1.1.4.jar slave leveldb
0 [INFO] Main main bitsofproof supernode (c) 2013 bits of proof zrt.
660 [INFO] Main main Loading profile: slave
660 [INFO] Main main Loading profile: leveldb
3560 [WARN] JtaTransactionManager main No JTA TransactionManager found: transaction suspension not available
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
    at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:62)
    at org.bouncycastle.util.encoders.Hex.encode(Unknown Source)
    at org.bouncycastle.util.encoders.Hex.encode(Unknown Source)
    at com.bitsofproof.supernode.common.ByteUtils.toHex(ByteUtils.java:164)
    at com.bitsofproof.supernode.common.Hash.toString(Hash.java:118)
    at com.bitsofproof.supernode.model.Blk.fromLevelDB(Blk.java:111)
    at com.bitsofproof.supernode.model.LvlStore$1.process(LvlStore.java:178)
    at com.bitsofproof.supernode.model.LvlDiskStore.forAll(LvlDiskStore.java:182)
    at com.bitsofproof.supernode.model.LvlStore.cacheChain(LvlStore.java:170)
    at com.bitsofproof.supernode.core.CachedBlockStore.cache(CachedBlockStore.java:370)
    at com.bitsofproof.supernode.main.Supernode.start(Supernode.java:69)
    at com.bitsofproof.supernode.main.Main.main(Main.java:75)

I ran it now with 3 gigs, let's see what happens.

bitsofproof commented 11 years ago

Low memory consumption is not the design goal but speed of access. In particular the probabilistic index of transactions is kept in memory.