OpenBSD AMD64 NoMemoryError - bug ?

  • Thread starter Jeremy Hinegardner
  • Start date
J

Jeremy Hinegardner

--qVHblb/y9DPlgkHs
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi all,

I'm encountering an odd error, but only on the amd64 using OpenBSD. I
believe I've boiled it down to the attached test case. Here's an
example run on 2 systems I have:

First on CentOS 4.2 x86 with 1GB of RAM:

$ ./obsd-amd64-membug.rb
Allocating a big array of strings of length 300.
We've done enough:
Array size = 1789570
Estimated memory size = ruby + 512.00008392334 MB

Good, it does the right thing. Next on AMD64 OpenBSD 3.7 with 1GB of RAM:

% ./obsd-amd64-membug.rb
Allocating a big array of strings of length 300.
Caught exception
Array size = 126103
[FATAL] failed to allocate memory

Hmm... odd it failed to allocate memory on a 'puts'. Very strange. Now
if we alter the script slightly, just remove the '\t' from lines 27 and 28
in the rescue block we get:

% ./obsd-amd64-membug.rb
Allocating a big array of strings of length 300.
Caught exception
Array size = 126103
Estimated memory size = ruby + 36.0783576965332 MB

./obsd-amd64-membug.rb:13:in `initialize_copy'
./obsd-amd64-membug.rb:13
1) Caught exception failed to allocate memory
2) Caught exception NoMemoryError

I seemed to remember several times in the past year where there have
been whitespace issues in a script that caused odd bugs, but I was
unable to find them.

Anyone have a clue?

enjoy,

-jeremy

--
========================================================================
Jeremy Hinegardner (e-mail address removed)


--qVHblb/y9DPlgkHs
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="obsd-amd64-membug.rb"

#!/usr/local/bin/ruby

MULTIPLIER = 10
MAX_ALLOC = 1024 * 1024 * 512 # 512MB

msg = "This is some ruby data (#####)" * MULTIPLIER
max_msg_kb = msg.length.to_f / 1024.0

puts "Allocating a big array of strings of length #{msg.length}."
y = Array.new
begin
while true do
y << msg.dup
est_size = y.length * max_msg_kb * 1024
if est_size >= MAX_ALLOC then
puts "We've done enough:"
puts "\tArray size = #{y.length}"
puts "\tEstimated memory size = ruby + #{est_size / 1024 / 1024} MB"
exit 0
end
end
rescue SystemExit => se
exit 0
rescue Exception => e
begin
puts "Caught exception"
puts "\tArray size = #{y.length}"
puts "\tEstimated memory size = ruby + #{(y.length * max_msg_kb) / 1024} MB"
puts
puts e.backtrace.join("\n")
puts " 1) Caught exception #{$!}"
puts " 2) Caught exception #{e.class}"
rescue Exception => e2
puts e2.backtrace.join('\n')
end
exit 1
end

exit 0

--qVHblb/y9DPlgkHs--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top