Ruby对象有大小限制吗?

Ruby对象有大小限制吗?,ruby,Ruby,我正在构建一些大型字符串,它们在应用程序中的生命周期很短。字符串对象是否会任意增长到ruby实例的物理极限 我想知道的是,如果没有限制字符串大小的任何干预,我的应用程序是否会因内存不足而被关闭,或者它是否会正常降级 谢谢你的意见 有一个限制。String可以是2**31-1(因此在64位ruby上2**63-1)。您可以通过以下方式查看限制: >> s = String.new("1" * (2**32)) RangeError: bignum too big to convert

我正在构建一些大型字符串,它们在应用程序中的生命周期很短。字符串对象是否会任意增长到ruby实例的物理极限

我想知道的是,如果没有限制字符串大小的任何干预,我的应用程序是否会因内存不足而被关闭,或者它是否会正常降级


谢谢你的意见

有一个限制。
String
可以是
2**31-1
(因此在64位ruby上
2**63-1
)。您可以通过以下方式查看限制:

>> s = String.new("1" * (2**32))
RangeError: bignum too big to convert into `long'
    from (irb):3:in `*'
    from (irb):3
>> s = String.new("1" * (2**31))
RangeError: bignum too big to convert into `long'
    from (irb):4:in `*'
    from (irb):4
话虽如此,虽然您可以尝试分配这么大的字符串,但它可能会失败(至少在32位系统上,因为进程可以分配的最大内存量通常在2.5到3GB之间,
2**31-1
长度字符串本身接近2GB),如图所示:

>> "1" * (2**30)
NoMemoryError: failed to allocate memory
    from /usr/lib/ruby/1.8/irb.rb:310:in `inspect'
    from /usr/lib/ruby/1.8/irb.rb:310:in `output_value'
    from /usr/lib/ruby/1.8/irb.rb:159:in `eval_input'
    from /usr/lib/ruby/1.8/irb.rb:271:in `signal_status'
    from /usr/lib/ruby/1.8/irb.rb:155:in `eval_input'
    from /usr/lib/ruby/1.8/irb/ruby-lex.rb:244:in `each_top_level_statement'
    from /usr/lib/ruby/1.8/irb/ruby-lex.rb:230:in `loop'
    from /usr/lib/ruby/1.8/irb/ruby-lex.rb:230:in `each_top_level_statement'
    from /usr/lib/ruby/1.8/irb/ruby-lex.rb:229:in `catch'
    from /usr/lib/ruby/1.8/irb/ruby-lex.rb:229:in `each_top_level_statement'
    from /usr/lib/ruby/1.8/irb.rb:154:in `eval_input'
    from /usr/lib/ruby/1.8/irb.rb:71:in `start'
    from /usr/lib/ruby/1.8/irb.rb:70:in `catch'
    from /usr/lib/ruby/1.8/irb.rb:70:in `start'
    from /usr/bin/irb:13
Maybe IRB bug!!
我不相信有任何方法可以抓住
NoMemoryError


更新以反映来自

的评论,实际上它可以大到
2**31-1
(相应地,64位ruby上的
2**63-1
)。这是
2**31-1
字符还是
2**31-1
字节?此外,捕捉到一个
命名错误
不就是说
救援异常
而不是
救援
(后者只救援相对温和的异常)吗?(更不用说neversaydie…)
2**31-1
bytes。包含
rescue Exception
确实捕获了
NoMemoryError
,但它似乎没有实际执行分配(因为它会立即返回)