Electric-Coin-Company / kotlin-bip39

A concise implementation of BIP-0039 in Kotlin for Android. In order, it prioritizes being secure, concise and idiomatic.
MIT License
35 stars 8 forks source link

D8 java.lang.OutOfMemoryError: Java heap space #201

Closed HonzaR closed 1 year ago

HonzaR commented 1 year ago

Describe the issue

After our latest changes https://github.com/zcash/kotlin-bip39/pull/185 or https://github.com/zcash/kotlin-bip39/pull/188 we started to experience ERROR: D8: java.lang.OutOfMemoryError: Java heap space while using the BIP-39 library with Secant wallet app.

Can you reliably reproduce the issue?

If so, please list the steps to reproduce below:

  1. In the Secant change the BIP-39 dependency version from 1.0.4 to 1.0.5
  2. Run ./gradlew build
  3. The build task fails with the OutOfMemoryError error

Actual behavior + errors

> Task :ui-screenshot-test:mergeExtDexZcashmainnetDebug FAILED
ERROR: D8: java.lang.OutOfMemoryError: Java heap space
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
        at com.android.builder.dexing.D8DexArchiveMerger.getMergingExceptionToRethrow(D8DexArchiveMerger.java:159)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:147)
        at com.android.build.gradle.internal.tasks.DexMergingWorkAction.merge(DexMergingTask.kt:893)
        at com.android.build.gradle.internal.tasks.DexMergingWorkAction.run(DexMergingTask.kt:837)
        at com.android.build.gradle.internal.profile.ProfileAwareWorkAction.execute(ProfileAwareWorkAction.kt:74)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
        at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
        at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:169)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:187)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:120)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:162)
        at org.gradle.internal.Factories$1.create(Factories.java:31)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:114)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:157)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:126)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
        at Version.fakeStackEntry(Version_8.0.46.java:0)
        at com.android.tools.r8.utils.N0.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:74)
        at com.android.tools.r8.utils.N0.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:27)
        at com.android.tools.r8.utils.N0.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:26)
        at com.android.tools.r8.utils.N0.b(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:2)
        at com.android.tools.r8.D8.run(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:11)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:145)
        ... 38 more
Caused by: java.lang.OutOfMemoryError: Java heap space
        at java.base/java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:64)
        at java.base/java.nio.ByteBuffer.allocate(ByteBuffer.java:363)
        at com.android.tools.r8.ByteBufferProvider.acquireByteBuffer(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:1)
        at com.android.tools.r8.dex.x.b(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:1)
        at com.android.tools.r8.dex.x.c(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:3)
        at com.android.tools.r8.dex.x.e(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:1)
        at com.android.tools.r8.dex.J.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:124)
        at com.android.tools.r8.dex.J.b(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:1)
        at com.android.tools.r8.dex.k.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:524)
        at com.android.tools.r8.dex.k$$Lambda$3666/0x00000008005fa860.get(Unknown Source)
        at com.android.tools.r8.utils.m3.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:48)
        at com.android.tools.r8.dex.k.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:523)
        at com.android.tools.r8.dex.k.b(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:36)
        at com.android.tools.r8.dex.k$$Lambda$3632/0x0000000801111100.apply(Unknown Source)
        at com.android.tools.r8.utils.S2.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:4)
        at com.android.tools.r8.utils.S2$$Lambda$3167/0x0000000801bbebb0.a(Unknown Source)
        at com.android.tools.r8.utils.S2.a(R8_8.0.46_2ffa4e0571e5ebfa8c3310c54d5dda57b06b7af8069dc742e901fe496c3e13dd:40)
        at com.android.tools.r8.utils.S2$$Lambda$3134/0x0000000801865000.call(Unknown Source)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1428)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

Any extra information that might be useful in the debugging process.

Our guess is the long method in the linked change of the word list optimization might be blowing up the dexing, although it could also be the multiplatform changes.

We already filed it in the Google issue tracker and waiting for the Google team's reply.

HonzaR commented 1 year ago

Closing as resolved by increasing Gradle heap size, if needed, as we did in the Secant wallet https://github.com/zcash/secant-android-wallet/pull/896