java.lang.OutOfMemoryError error occurs when StringScanner keeps storing << and scan results in an array.
(JRuby only, not CRuby)
No Problem Code
- string_scanner_scan_string.rb
require 'strscan'
s = StringScanner.new('')
N = 100000
a = []
N.times do
s.string = s.rest + "1234567890"
a << s.scan(/.*/)
end
$ ruby string_scanner_scan_string.rb
$
Problem Code
require 'strscan'
s = StringScanner.new('')
N = 100000
a = []
N.times do
s << "1234567890"
a << s.scan(/.*/)
end
$ ruby string_scanner_scan.rb
Error: Your application used more memory than the automatic cap of 3758MB.
Specify -J-Xmx####M to increase it (#### = cap size in MB).
Specify -w for full java.lang.OutOfMemoryError: Java heap space stack trace
Estimated memory requirements
100,000 x 10 [Byte] = 1,000,000 [Byte] = 1 [MB]
The above is required for Array and StringScanner.
1 [MB] x 2 = 2 [MB]
3758MB is not needed, so a memory leak is likely to occur.
Environment
$ ruby -v
jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f Java HotSpot(TM) 64-Bit Server VM 25.121-b13 on 1.8.0_121-b13 +jit [x86_64-darwin]
$ gem list strscan
*** LOCAL GEMS ***
strscan (3.0.8 java, default: 3.0.7 java)