[VM][ENH] LowSpaceAndInterruptHandler-dtl

David T. Lewis lewis at mail.msen.com
Tue Apr 5 04:15:25 UTC 2005


On Mon, Apr 04, 2005 at 02:14:06PM -0400, David T. Lewis wrote:
> On Mon, Apr 04, 2005 at 09:50:13AM -0700, Andreas Raab wrote:
> > Thanks for the code but let's not get too fast with this - I am still
> > trying to understand why you could make the crash happen reliably... in
> > some ways this doesn't make sense (since the failure should be triggered
> > statistically) and I'd rather see that we either have situations in
> > which we do not fail or that we understand why exactly we can repeat
> > this behavior with 100% reliability (my explanation does not explain that).
> 
> It depends on how much time elapses between the low space condition
> and the arrival of the signal to the semaphore. If more than 500ms is
> consistently being used for garbage collection, then your explanation
> holds up very well. (Note: I am using a relatively slow 850MHz Pentium).

I ran some additional tests this evening and confirmed that, on my machine,
the GC at the time of low space detection is consistently taking more than
500ms. Under these conditions, we should see a 100% failure rate, which
is what I am observing. This is with a 9M fixed memory size, an 850MHz
Pentium, and Unix VM.

The debugging output from five repeated tests is attached, showing console
output produced with #createStackOverflow. The numbers to the left of each
line are millisecond clock values, the first three of them done with printf
in the VM, and the fourth with an OSProcess trace from the image. They
show about 600ms elapsed time between entering allocateChunk() and signaling
the low space semaphore from checkForInterrupts().

Dave

====
28230 allocateChunk() entered
28823 allocateChunk() detected low memory condition
28824 checkForInterrupts() about to signal the low space semaphore
28825:2390:3864:SystemDictionary>>lowSpaceWatcher:low space semaphore signal received, preempted process is
 [] in EventSensor>>eventTickler {[delay wait.  delta := Time millisecondClockValue - lastEventPoll.  (delta <...]}
 BlockContext>>on:do:
 [] in EventSensor>>installEventTickler {[self eventTickler]}
 [] in BlockContext>>newProcess {[self value.  Processor terminateActive]}
====
27584 allocateChunk() entered
28176 allocateChunk() detected low memory condition
28177 checkForInterrupts() about to signal the low space semaphore
28178:1185:3864:SystemDictionary>>lowSpaceWatcher:low space semaphore signal received, preempted process is
 [] in EventSensor>>eventTickler {[delay wait.  delta := Time millisecondClockValue - lastEventPoll.  (delta <...]}
 BlockContext>>on:do:
 [] in EventSensor>>installEventTickler {[self eventTickler]}
 [] in BlockContext>>newProcess {[self value.  Processor terminateActive]}
====
73783 allocateChunk() entered
74374 allocateChunk() detected low memory condition
74375 checkForInterrupts() about to signal the low space semaphore
74377:3662:3864:SystemDictionary>>lowSpaceWatcher:low space semaphore signal received, preempted process is
 [] in EventSensor>>eventTickler {[delay wait.  delta := Time millisecondClockValue - lastEventPoll.  (delta <...]}
 BlockContext>>on:do:
 [] in EventSensor>>installEventTickler {[self eventTickler]}
 [] in BlockContext>>newProcess {[self value.  Processor terminateActive]}
====
121860 allocateChunk() entered
122451 allocateChunk() detected low memory condition
122452 checkForInterrupts() about to signal the low space semaphore
122453:792:3864:SystemDictionary>>lowSpaceWatcher:low space semaphore signal received, preempted process is
 [] in EventSensor>>eventTickler {[delay wait.  delta := Time millisecondClockValue - lastEventPoll.  (delta <...]}
 BlockContext>>on:do:
 [] in EventSensor>>installEventTickler {[self eventTickler]}
 [] in BlockContext>>newProcess {[self value.  Processor terminateActive]}
====
166147 allocateChunk() entered
166743 allocateChunk() detected low memory condition
166744 checkForInterrupts() about to signal the low space semaphore
166745:3674:3864:SystemDictionary>>lowSpaceWatcher:low space semaphore signal received, preempted process is
 [] in EventSensor>>eventTickler {[delay wait.  delta := Time millisecondClockValue - lastEventPoll.  (delta <...]}
 BlockContext>>on:do:
 [] in EventSensor>>installEventTickler {[self eventTickler]}
 [] in BlockContext>>newProcess {[self value.  Processor terminateActive]}
====




More information about the Vm-dev mailing list