Re: java.lang.OutOfMemoryError (Almost SOLVED)
Ricardo Strausz <[email protected]> Thu, 24 Jul 2003 15:57:27 -0500
| Newsgroups | gmane.comp.web.webobjects.eof |
|---|---|
| Message-ID | <[email protected]> |
Finally...
After a LOT of try-and-fail, I found something which now is so obvious
(eventhough it was not, at least for me... this only reveals how blind
can someone be): the objects you want to survive after the
AutoRelasePool is released have to be retained ---eventhough you own
them?---.
The final code look like (it is inside a huge loop):
pool = [NSAutoRealasePool new];
array = [self giveMeAHugeArrayOfEOs];
en = [array objectEnumerator];
int sum = 0;
while(eo = [en nextObject]) sum += [eo intValue];
theSum = [NSNumber numberWithInt:sum];
/*HERE COMES THE IMPORTANT PART:*/
[theSum retain];
[pool release];
[results addObject:theSum]; // at this point, theSum is still a vivid
object ;^()
HOWEVER: I had not found a way to assign more than 64Mb (the default)
to my JVM in a Cocoa/EO app. If some one find out, please let us know,
Yours,
Dino
Thanks to Chuck and Others who helped solve this.
> That probably means you have referenced an object after it has been
> release. Be careful that you retain any objects created in the loop
> that
> need to live after it. And don't refer to pool after releasing it.
>
>
> Chuck
>
>
>
> At 12:28 PM 11/04/2003 -0600, Ricardo Strausz wrote:
>> I did try some thing as:
>>
>> pool = [NSAutoreleasePool new];
>> anArray = [self giveMeAHugeArray];
>> /* proces the array */
>> [pool release];
>>
>> But the app crashes (with bussignal 10)... any idea?
>>
>>
>> On jueves, abri 10, 2003, at 12:31 America/Mexico_City, Chuck Hill
>> wrote:
>>
>>> Look at the docs for NSAutoreleasePool. Wrap the inside of your
>>> loops
>>> in an autorelease pool to clean up the temporary objects that you
>>> create. You will need to retain any objects created in the loop that
>>> need to live after it.
>>>
>>> e.g.
>>> for(j=0;j<BLOQUES;j++){
>>> // create pool
>>> // processing here...
>>> // release pool
>>> }
>>>
>>>
>>> Chuck
>>>
>>>
>>> Ricardo Strausz wrote:
>>>
>>>> Szia mindenki!
>>>> I just recived the following error:
>>>> 2003-04-10 10:50:48.720 Clientes[649] java/lang/OutOfMemoryError
>>>> Stack Trace:
>>>> java.lang.OutOfMemoryError
>>>> <<no stack trace available>>
>>>> I have to do some statistics in a not-to-log database (5,000 clients
>>>> x 50,000 invoices) but I am running out of memory... well, from
>>>> Java's point of view, becouse I have 512MB in RAM and 1.3GB in HD,
>>>> and, at the end my disk is equal in size.
>>>> Is there some way to assign more memory to the JVM??
>>>> Does it uses my VM??
>>>> I show down my code; is there an ease way to do it more efficient??
>>>> Thanks in advance
>>>> Dino
>>>> - (IBAction)monto:(id)sender
>>>> {
>>>> NSArray* nsa = [dgClientes displayedObjects];
>>>> NSEnumerator* en = [nsa objectEnumerator];
>>>> id eo = nil;
>>>> NSArray* facturas = nil;
>>>> int i = 0;
>>>> int j = 0;
>>>> BOOL ok = YES;
>>>> int cambiaron = 0;
>>>> int MESES = [[forma cellAtIndex:0] intValue];
>>>> int BLOQUES = [[forma cellAtIndex:1] intValue];
>>>> if([nsa count]>0) eo = [en nextElement];
>>>> else return;
>>>> while(eo != nil){
>>>> facturas = [self ordena:[self facturasDe:eo]
>>>> enBloquesDeTamanyo:MESES
>>>> desde:[NSCalendarDate dateWithString:@"1 1 1996" calendarFormat:@"%m
>>>> %d %Y"]];
>>>> if([facturas count]>BLOQUES){
>>>> for(i=0;i<[facturas count]-BLOQUES;i++){
>>>> for(j=0;j<BLOQUES;j++){
>>>> if([[facturas objectAtIndex:i+j] count]>0) ok = YES;
>>>> else {
>>>> ok = NO;
>>>> break;
>>>> }
>>>> }
>>>> if(ok){
>>>> [eo setGrupo:[NSNumber numberWithInt:MESES]];
>>>> cambiaron++;
>>>> break;
>>>> }
>>>> }
>>>> }
>>>> NS_DURING
>>>> eo = [en nextElement];
>>>> NS_HANDLER
>>>> eo = nil;
>>>> NS_ENDHANDLER
>>>> }
>>>> [[forma cellAtIndex:2] setIntValue:cambiaron];
>>>> }
>>>> - (NSArray*)facturasDe:(id)eo
>>>> {
>>>> NSString* nss = [NSString stringWithFormat:@"cliente=%@ and
>>>> estado>0",[eo folio]];
>>>> id eoq = [EOQualifier qualifierWithQualifierFormat:nss:nil];
>>>> NSArray* nsa = nil;
>>>> [[dgFacturas dataSource] setAuxiliaryQualifier:eoq];
>>>> [dgFacturas fetch:self];
>>>> nsa = [dgFacturas displayedObjects];
>>>> return nsa;
>>>> }
>>>> - (NSArray*)ordena:(NSArray*)nsa
>>>> enBloquesDeTamanyo:(int)meses
>>>> desde:(NSCalendarDate*)desde
>>>> {
>>>> NSMutableArray* nsmaa = [NSMutableArray array];
>>>> NSMutableArray* nsmab = [NSMutableArray array];
>>>> NSCalendarDate* nscda = desde;
>>>> NSCalendarDate* nscdb = [nscda dateByAddingYears:0
>>>> months:meses
>>>> days:0
>>>> hours:0
>>>> minutes:0
>>>> seconds:0];
>>>> NSEnumerator* en = [nsa objectEnumerator];
>>>> id eo = nil;
>>>> NSCalendarDate* eoFecha = [NSCalendarDate alloc];
>>>> if([nsa count]>0) eo = [en nextElement];
>>>> else return nsmaa;
>>>> while(eo != nil){
>>>> [eoFecha initWithString:[[[eo fecha] toString] substringToIndex:11]
>>>> calendarFormat:@"%Y-%m-%d"];
>>>> if([[eoFecha laterDate:nscda] isEqual:eoFecha]
>>>> && [[eoFecha laterDate:nscdb] isEqual:nscdb]){
>>>> [nsmaa addObject:eo];
>>>> NS_DURING
>>>> eo = [en nextElement];
>>>> NS_HANDLER
>>>> eo = nil;
>>>> NS_ENDHANDLER
>>>> } else {
>>>> [nsmab addObject:nsmaa];
>>>> nsmaa = [NSMutableArray array];
>>>> nscda = nscdb;
>>>> nscdb = [nscda dateByAddingYears:0
>>>> months:meses
>>>> days:0
>>>> hours:0
>>>> minutes:0
>>>> seconds:0];
>>>> }
>>>> }
>>>> [eoFecha release];
>>>> return nsmab;
>>>> }
>>>
>>>
>>> --
>>>
>>> Chuck Hill [email protected]
>>> Global Village Consulting Inc.
>>> http://www.global-village.net
>>>
>>>
>>>
>>> _______________________________________________
>>> EOF mailing list
>>> [email protected]
>>> http://www.omnigroup.com/mailman/listinfo/eof
>>
>>
>
> --
>
> Chuck Hill [email protected]
> Global Village Consulting Inc.
> http://www.global-village.net
>
>
Dino
http://homepage.mac.com/strausz