OOM error when polling large number of contacts
- Android version: 13
- Phone model: Realme RMX3516 (RMX3516EEA)
- Briar version: 1.5.4 (7d761710)
Stacktrace:
java.lang.OutOfMemoryError: Failed to allocate a 48 byte allocation with 252528 free bytes and 246KB until OOM, target footprint 201326592, growth limit 201326592; giving up on allocation because <1% of heap free after GC.
at java.util.regex.Pattern.matcher(Pattern.java:1040)
at org.briarproject.bramble.plugin.tor.TorPlugin.createConnection(TorPlugin.java:361)
at org.briarproject.bramble.plugin.tor.TorPlugin.lambda$connect$2(TorPlugin.java:349)
at org.briarproject.bramble.plugin.tor.TorPlugin.$r8$lambda$dsAekyWijvXWn3loJi16FAklboE(Unknown Source:0)
at org.briarproject.bramble.plugin.tor.TorPlugin$$ExternalSyntheticLambda4.run(Unknown Source:6)
at org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManagerImpl.lambda$executeWakefully$0(AndroidWakeLockManagerImpl.java:71)
at org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManagerImpl.$r8$lambda$YrcWd5iwE_LXXUj-LlmRNhzP9-U(Unknown Source:0)
at org.briarproject.android.dontkillmelib.wakelock.AndroidWakeLockManagerImpl$$ExternalSyntheticLambda0.run(Unknown Source:4)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
at java.lang.Thread.run(Thread.java:1012)
- NativeHeapAllocated: 467,674,320
- NativeHeapFree: 57,465,872
- NativeHeapTotal: 539,607,040
- SystemMemoryFree: 1,281,261,568
- SystemMemoryLow: false
- SystemMemoryThreshold: 339,738,624
- SystemMemoryTotal: 3,834,589,184
- VirtualMachineMemoryFree: 4,663,224
- VirtualMachineMemoryMaximum: 201,326,592
- VirtualMachineMemoryTotal: 201,326,592
The log shows that the crash happened about 9 seconds after polling the Tor plugin. Connection attempts from the previous two polls were still in progress, as shown by the messages logged when those attempts timed out. The previous two polls appear to have happened in quick succession, as two failures for the same address were often logged back-to-back. (This can happen when the plugin's enabled, as the first poll happens immediately and the second is scheduled after a randomised interval.)
The log shows that the user has at least 54 contacts. I'd speculate that this may cause polling to take longer than the polling interval, causing pending connection attempts to pile up.
All of the connection failures except the last are logged as "java.io.IOException: Connection failed: Host unreachable". The last connection failure is logged as "java.net.SocketTimeoutException: failed to connect to /127.0.0.1 (port 59050) from /127.0.0.1 (port 57012) after 5000ms", indicating that the connection to Tor's SOCKS port on localhost timed out. Perhaps the Tor process had become unresponsive, or perhaps the Java process was spending too much time in GC to service the connection.
The memory stats show 539 MB of native heap, which is a lot! Maybe there's a large backlog of socket connections, each with some native heap allocations, and each with an IoExecutor thread waiting on it that might have its own native heap allocations?
VirtualMemoryFree
doesn't match the amount in the OOM error message, which is an issue we've seen before (#1898 (comment 76643)).
It's useful to know that the allocator gives up if it can't free more than 1% of the max heap space after GC.