[ruby-core:64729] [ruby-trunk - Bug #10191] Possible memory leak using dup and setting an unassigned instance variable (Windows)

From: nobu@...
Date: 2014-09-03 07:34:13 UTC
List: ruby-core #64729
Issue #10191 has been updated by Nobuyoshi Nakada.

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

----------------------------------------
Bug #10191: Possible memory leak using dup and setting an unassigned instance variable (Windows)
https://bugs.ruby-lang.org/issues/10191#change-48623

* Author: Ben Hellerstein
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: 1.9.3p327 (2012-11-10) [i386-mingw32] (also present in 2.0.0p481 [i386-mingw32] from rubyinstaller.org)
* Backport: 2.0.0: REQUIRED, 2.1: REQUIRED
----------------------------------------
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

(2) 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





-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next