This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: [OT] Re: Controlling the garbage collector (GC) at RT?


I tried the attached program on Linux 2.6.7rc3 running on a 4GB IA64
machine with 1GB swap space.  It failed with a signal with the default
overcommit policy of 0.

After an

echo 2 > /proc/sys/vm/overcommit_memory

as root it failed with sbrk returning zero.  My interpretation is that
the overcommit policy zero heuristic may need a bit of work, but things
basically work as described.

I repeated the experiment with an old X86 machine (256M mem + 512M swap)
running 2.4.18, with basically identical results.

This seems to be a system configuration issue.

Hans

> -----Original Message-----
> From: Martin Egholm Nielsen [mailto:martin@egholm-nielsen.dk] 
> Sent: Thursday, March 17, 2005 1:15 AM
> To: Boehm, Hans
> Subject: [OT] Re: Controlling the garbage collector (GC) at RT?
> 
> 
> Hi Hans,
> 
> >>> You also need to touch the resulting memory.  Try something like 
> >>> char *v = sbrk( 1000000 ); for (char *p = v; p < p + 
> 1000000; ++p) 
> >>> *p = 42; in the loop.
> >> I'll try something similar tomorrow, thanks alot - although I will
> >> need modify the ever true statement "p < p + 1M" to "p < v + 1M"...
> > So, now I tried this:
> > 
> > #include <unistd.h>
> > 
> > int main( int i )
> > {
> >   while ( 1 ) {
> >     char *v = sbrk( 1000000 );
> >     char *p;
> >     for (*p = v; p < v + 1000000; ++p) {
> >       *p = 42;
> >     } // for
> > 
> >     printf( "%x\n\n", v );
> >   } // while
> > } // main
> > 
> > And still nothing happens with the memory consumption, although the
> > pointer ends up at 0xffffffff...
> Nooow, after modifying the program to
> 
> for ( p = v; ...
> 
> it "works" - the application is terminated by the kernel.
> This goes regardless what [0,1,2] is echo'ed into 
> "/proc/sys/vm/overcommit_memory"...
> The kernel reports:
> 
> Out of Memory: Killed process 36 (sbrktest)
> 
> But what should the outcome really had been?
> 
> I tried the same on an elder kernel on a different target - 
> 2.4.17 and 
> i386 - and the same outcome...
> 
> BR,
>   Martin Egholm
> 
> >>>> -----Original Message-----
> >>>> From: java-owner@gcc.gnu.org [mailto:java-owner@gcc.gnu.org] On 
> >>>> Behalf Of Martin Egholm Nielsen
> >>>> Sent: Wednesday, February 23, 2005 12:04 AM
> >>>> To: java@gcc.gnu.org
> >>>> Subject: Re: Controlling the garbage collector (GC) at RT?
> >>>>
> >>>>
> >>>>
> >>>>> It seems to me that the only problem here is that this 
> >>>> still seems to
> >>>>> happen with overcommit-accounting set to 2.
> >>>>> I would expect that you can reproduce this problem with a 
> >>>> program that
> >>>>> alternately allocates a few MB with sbrk, and then touches the 
> >>>>> allocated memory.  If you can't, there's something really 
> >>>> weird going
> >>>>> on here.  If you can, it'll give you a test case for the kernel 
> >>>>> people.
> >>>> I tried the following:
> >>>>
> >>>> #include <unistd.h>
> >>>>
> >>>> int main( int i )
> >>>> {
> >>>>   while ( 1 ) {
> >>>>     void *v = sbrk( 100000 );
> >>>>     // sleep( 1 );
> >>>>   } // while
> >>>> } // main
> >>>>
> >>>> But that doesn't result in anything - the memory usage for the 
> >>>> application does not grow...
> >>>> Are there anything else I should do to allocate the memory?
> >>>>
> >>>> BR,
> >>>>  Martin
> >>>>
> >>>>
> >>>>> Hans
> >>>>>
> >>>>> On Wed, 16 Feb 2005, Martin Egholm Nielsen wrote:
> >>>>>
> >>>>>
> >>>>>
> >>>>>> Hi Hans,
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>>>> It would indeed be interesting to know why the Linux kernel
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>>>> kills the application rather than returning failure.
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>>> Sure, but how to do that? Any guidelines?
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> What do you see on the console?  Anything in the system log?  
> >>>>>>> Does strace tell you anything?
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> Below is the last part of "strace -f -F -i -v". It doesn't 
> >>>>
> >>>>
> >>>>
> >>>> really look
> >>>>
> >>>>>> like there's anything of value?
> >>>>>>
> >>>>>> // Martin
> >>>>>>
> >>>>>> [pid    75] [0f833558] write(1, "*** MEM CHUNK TAKEN: 
> >>>>
> >>>>
> >>>>
> >>>> 8388608\n", 29***
> >>>>
> >>>>>> MEM CHUNK TAKEN: 8388608
> >>>>>> ) = 29
> >>>>>> [pid    75] [0f839834] brk(0x12d15000)  = 0x12d15000
> >>>>>> [pid    75] [0f839834] brk(0x12d25000)  = 0x12d25000
> >>>>>> [pid    75] [0f81126c] getpid()         = 75
> >>>>>> [pid    75] [0f799444] kill(77, SIGPWR <unfinished ...>
> >>>>>> [pid    76] [0f840e2c] <... poll resumed> [{fd=3, 
> events=POLLIN,
> >>>>>> revents=POLLIN}
> >>>>>> ], 1, 2000) = 1
> >>>>>> [pid    75] [0f799444] <... kill resumed> ) = 0
> >>>>>> [pid    76] [0f81127c] getppid()        = 75
> >>>>>> [pid    76] [0f833548] read(3,
> >>>>>> "\20\7/\234\0\0\0\4\17\374$0\20\7/\240$\0\0B\17\3
> >>>>>> 72j(\177"..., 148) = 148
> >>>>>> [pid    76] [0f840e2c] poll( <unfinished ...>
> >>>>>> [pid    75] [0f799444] kill(77, SIGXCPU) = 0
> >>>>>> [pid    75] [0f839834] brk(0x13525000)  = 0x13525000
> >>>>>> [pid    75] [0f833558] write(1, "*** MEM CHUNK TAKEN: 
> >>>>
> >>>>
> >>>>
> >>>> 8388608\n", 29***
> >>>>
> >>>>>> MEM CHUNK TAKEN: 8388608
> >>>>>> ) = 29
> >>>>>> [pid    75] [0f839834] brk(0x13535000)  = 0x13535000
> >>>>>> [pid    75] [0f839834] brk(0x13545000)  = 0x13545000
> >>>>>> [pid    75] [0f839834] brk(0x13d45000)  = 0x13d45000
> >>>>>> [pid    75] [0f833558] write(1, "*** MEM CHUNK TAKEN: 
> >>>>
> >>>>
> >>>>
> >>>> 8388608\n", 29***
> >>>>
> >>>>>> MEM CHUNK TAKEN: 8388608
> >>>>>> ) = 29
> >>>>>> [pid    76] [0f840e2c] <... poll resumed> [{fd=3, 
> >>>>
> >>>>
> >>>>
> >>>> events=POLLIN}], 1,
> >>>>
> >>>>>> 2000) = 0
> >>>>>> [pid    76] [0f840e2c] --- SIGTERM (Terminated) ---
> >>>>>> #
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>
> >>>
> >>
> >>
> > 
> > 
> 
> 

Attachment: exhaust_mem.c
Description: exhaust_mem.c


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]