Project

General

Profile

Actions

Bug #10191

closed

Possible memory leak using dup and setting an unassigned instance variable (Windows)

Added by benhell (Ben Hellerstein) over 9 years ago. Updated over 9 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
1.9.3p327 (2012-11-10) [i386-mingw32] (also present in 2.0.0p481 [i386-mingw32] from rubyinstaller.org)
[ruby-core:64700]

Description

Steps:

  1. Run the following code (tested on Window 7):
class Leaky
  attr_accessor :v
  def leak; d = dup; d.v = nil; end
end

l = Leaky.new
while true; l.leak; end
  1. Watch the memory usage in Task Manager or equivalent
    Expected result:
    Infinite loop, memory usage fairly stable (as GC cleans up)

Actual result:
Interpreter consumes more and more memory, and eventually throws the following exception: "in `dup': failed to allocate memory (NoMemoryError)." Presumably, this is a memory leak.

Workaround:
If you manually set the instance variable before dup-ing, memory usage is stable. Accordingly, this code does not appear to leak memory:

class NonLeaky
  attr_accessor :v
  def leak; @v ||= nil; d = dup; d.v = nil; end
end

l = NonLeaky.new
while true; l.leak; end

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

  • Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

  • Description updated (diff)

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

Applied in changeset r47372.


object.c: fix memory leak

Updated by nagachika (Tomoyuki Chikanaga) over 9 years ago

  • Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE

r46501, r47372 and r47460 were backported into ruby_2_1 branch at r47520.
I add limit: 2.5 option argment to assert_no_memory_leak in the testcase because it fails with default threshold (1.5) on 2.1.

Updated by usa (Usaku NAKAMURA) over 9 years ago

  • Backport changed from 2.0.0: REQUIRED, 2.1: DONE to 2.0.0: DONE, 2.1: DONE

backported into ruby_2_0_0 at r47548.

In my environment, I don't have to change the limit of assert_no_memory_leak.
I may change it if CIs report some problems.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0